sql >> Databasteknik >  >> RDS >> Sqlserver

Foreign Key Constraint i underordnad tabell gör det möjligt att infoga värden som inte finns i den överordnade tabellen

Först har vi det praktiska skäl. Främmande nycklar underhålls och kontrolleras med hjälp av index. För att ett index ska vara användbart behöver vi känna till de (sökta) värdena för alla kolumner i indexet. Om vi ​​har ett index/pk på (a,b) och vi har ett främmande nyckelvärde på (NULL,1) , vi kan inte söka i indexet för att avgöra om det finns någon rad med en b värdet 1. Detta skulle göra den främmande nyckeln "dyr" att underhålla.

Men för det andra måste vi överväga konsekvens. För fallet med en kolumn är det ganska okontroversiellt - om du har ett värde i FK-kolumnen, måste det finnas ett matchande värde i den refererade kolumnen. Annars, om FK-kolumnen är NULL då kontrolleras inte begränsningen.

Men hur utökar vi detta till flera kolumner? Vad är regeln ovan? Det finns inte en enda självklar tolkning, men istället flera. Är ovanstående regel "if all kolumner är icke-NULL, då kontrolleras begränsningen" eller "om någon kolumner är icke-NULL, då kontrolleras begränsningen"? Dessa regler är identiska när endast en kolumn övervägs.

Du förväntade dig att regeln skulle vara den andra, när den faktiskt är den första. Detta är uttryckligen dokumenterat :



  1. Optimera MySQL/MariaDB-prestanda med verktyget MySQLTunner

  2. Uppföljaren har många, tillhör eller båda?

  3. Fel att lägga till främmande nyckel

  4. MySQL, json, JSON_ARRAY_APPEND - varför fungerar inte appen 5.7.13?