Ich bin ziemlich verwirrt über den Unterschied zwischen einer FOREIGN KEY und CHECK-Einschränkung - sie scheinen mir das gleiche Ergebnis zu erzielen.
Ich meine, ich könnte eine Tabelle erstellen und einen Fremdschlüssel für eine andere Tabelle erzwingen, aber ich könnte eine Überprüfung erstellen, um den Wert in einer anderen Tabelle zu sichern.
Was ist der Unterschied und wann soll man das eine oder das andere benutzen?
Ein FOREIGN KEY-Constrain stellt sicher, dass der Eintrag EXISTS in
existiertBEARBEITEN andere Tabelle
gemäß korrektem Kommentar Existiert in einer anderen Tabelle ... oder in derselben Tabelle. - Mark Byers
Ein CHECK-Constrain stellt sicher, dass der Eintrag einer bestimmten Regel folgt.
CHECK-Einschränkungen erzwingen die Domänenintegrität, indem sie die Werte begrenzen, die von einer Spalte akzeptiert werden. Sie ähneln den FOREIGN KEY-Einschränkungen insofern, als sie die Werte steuern, die in eine Spalte eingegeben werden. Der Unterschied besteht darin, wie sie bestimmen, welche Werte gültig sind: FOREIGN KEY-Einschränkungen erhalten die Liste gültiger Werte aus einer anderen Tabelle, und CHECK-Bedingungen bestimmen die gültigen Werte aus einem logischen Ausdruck, der nicht auf Daten in einer anderen Spalte basiert / strong>
Eine Fremdschlüsseleinschränkung ist leistungsfähiger als eine CHECK-Einschränkung.
Eine Fremdschlüsseleinschränkung bedeutet, dass die Spalte (in der aktuellen Tabelle) nur Werte enthalten kann, die bereits in der Spalte der Fremdtabelle vorhanden sind (die die gleiche Tabelle enthalten kann, die häufig für hierarchische Daten verwendet wird). Dies bedeutet, dass die Liste der Werte sich ändert - wird größer oder kleiner - es besteht keine Notwendigkeit, die Einschränkung zu aktualisieren.
Eine Prüfbedingung kann nicht auf Spalten außerhalb der aktuellen Tabelle verweisen und keine Unterabfrage enthalten. Oft sind die Werte fest codiert wie BETWEEN 100 and 999
oder IN (1, 2, 3)
. Das bedeutet, dass Sie die CHECK-Einschränkung jedes Mal aktualisieren müssen, wenn sich die Dinge ändern. Außerdem ist eine Fremdschlüsselbeziehung in einem Entity Relationship Diagram (ERD) sichtbar, während eine CHECK-Einschränkung niemals bestehen wird. Der Vorteil ist, dass jemand die ERD lesen und daraus eine Abfrage konstruieren kann, ohne zahlreiche DESC-Tabellenbefehle zu verwenden, um zu wissen, welche Spalten wo sind und was mit den richtigen Joins zusammenhängt.
Es empfiehlt sich, zunächst Fremdschlüssel (und unterstützende Tabellen) zu verwenden. Verwenden Sie CHECK-Einschränkungen als Sicherung für Situationen, in denen Sie keinen Fremdschlüssel verwenden können, und nicht als primäre Lösung zum Überprüfen von Daten.
Es hängt von Ihrem DBMS ab (das Sie nicht angegeben haben), aber in einem Sinne sind Sie richtig: Eine Fremdschlüssel-Einschränkung ist ein besonderer Fall einer Prüfbedingung. Es gibt DBMS, die es nicht erlauben würden, eine Fremdschlüsseleinschränkung als Prüfbedingung zu formulieren.
Die Hauptabsicht einer Prüfbedingung besteht darin, Bedingungen zu beschreiben, die für eine einzelne Zeile in der Tabelle gelten. Zum Beispiel habe ich eine Tabelle von Elementen (wie in Wasserstoff, Helium, ...) und die Symbole für die Elemente sind gezwungen, mit einem Großbuchstaben zu beginnen, gefolgt von Null, einem oder zwei Kleinbuchstaben ( zwei Kleinbuchstaben für noch unentdeckte, aber vorhergesagte Elemente: Uus - ununseptium (117), das hat gerade isoliert worden, aber muss noch benannt werden). Dies kann Gegenstand einer CHECK-Einschränkung sein:
%Vor%unter der Annahme, dass MATCHES existiert und eine geeignete reguläre Ausdruckssprache unterstützt.
Sie können auch Prüfbedingungen haben, die Werte vergleichen:
%Vor%Um eine Fremdschlüsselbeschränkung als Prüfbedingung auszudrücken, müssen Sie eine Abfrage in der CHECK-Klausel ausführen dürfen. Hypothetisch:
%Vor% Dieses Beispiel zeigt einige der Probleme. Ich habe kein praktisches Tabellenalias für die Tabelle, in der ich die Checkbeschränkung schreibe - ich nahm an, dass es 'ThisTable' war. Das Konstrukt ist ausführlich. Unter der Annahme, dass der Primärschlüssel für SomeTable in den Spalten pk_col1
und pk_col2
deklariert ist, ist die FOREIGN KEY-Klausel viel kompakter:
Oder wenn Sie einen alternativen Schlüssel referenzieren, nicht den Primärschlüssel:
%Vor%Dies ist notdürftig kompakter - so dass es weniger wahrscheinlich ist, es falsch zu machen - und kann vom Server speziell behandelt werden, weil die spezielle Notation weiß, dass es sich um eine Fremdschlüsselbeschränkung handelt, während die allgemeine Prüfklausel hat überprüft werden, ob es mit einer der vielen möglichen Formen übereinstimmt, die dem Fremdschlüssel entsprechen.
Die Frage lautet: Wann eine Check-Bedingung und wann eine Fremdschlüssel-Bedingung verwendet werden soll?