Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die Fremdschlüsseleinschränkung in der untergeordneten Tabelle ermöglicht das Einfügen von Werten, die in der übergeordneten Tabelle nicht vorhanden sind

Zuerst haben wir das praktische Gründe dafür. Fremdschlüssel werden über Indizes gepflegt und geprüft. Damit ein Index verwendbar ist, müssen wir die (gesuchten) Werte aller Spalten innerhalb des Index kennen. Wenn wir einen Index/pk auf (a,b) haben und wir haben einen Fremdschlüsselwert von (NULL,1) , wir können nicht suchen innerhalb des Index, um festzustellen, ob es eine Zeile mit einem b gibt Wert von 1. Dies würde die Pflege des Fremdschlüssels "teuer" machen.

Aber zweitens müssen wir auf Konsistenz achten. Für den Fall einer einzelnen Spalte ist es ziemlich unumstritten - wenn Sie einen Wert in der FK-Spalte haben, muss es einen übereinstimmenden Wert in der referenzierten Spalte geben. Andernfalls, wenn die FK-Spalte NULL ist dann wird die Einschränkung nicht geprüft.

Aber wie erweitern wir das auf mehrere Spalten? Was ist die Regel oben? Es gibt keine Single offensichtliche Interpretation, sondern mehrere. Ist die obige Regel "wenn alle Spalten nicht NULL sind, dann wird die Einschränkung überprüft" oder "falls irgendeine Spalten nicht NULL sind, dann wird die Einschränkung geprüft"? Diese Regeln sind identisch, wenn nur eine einzelne Spalte berücksichtigt wird.

Sie haben erwartet, dass die Regel die zweite ist, obwohl es tatsächlich die erste ist. Dies ist explizit dokumentiert :