Es hängt von Ihrem DBMS ab (das Sie nicht angegeben haben), aber in einem Sinne sind Sie richtig: Eine Fremdschlüsseleinschränkung ist ein besonderer Fall einer Prüfeinschränkung. 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 so beschränkt, dass sie mit einem Großbuchstaben beginnen und gefolgt von Null, einem oder zwei Kleinbuchstaben (zwei Kleinbuchstaben für noch unentdeckte, aber vorhergesagte Elemente: Uus - ununseptium (117) , die gerade isoliert wurde, aber noch nicht genannt wurde). Dies kann der Gegenstand einer CHECK-Einschränkung sein: unter der Annahme, dass MATCHES existiert und eine geeignete reguläre Ausdruckssprache unterstützt.
Sie können auch Check-Einschränkungen haben, die Werte zu vergleichen:
CHECK(OrderDate <= ShipDate OR ShipDate IS NULL)
Um einen Fremdschlüssel als Check-Bedingung auszudrücken, müssen Sie erlaubt werden, um eine Abfrage in der CHECK-Klausel auszuführen. Hypothetisch:
CHECK(EXISTS(SELECT * FROM SomeTable AS s
WHERE ThisTable.pk_col1 = s.pk_col1 AND
ThisTable.pk_col2 = s.pk_col2))
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 auf Sometable auf Spalten deklariert wird pk_col1
und pk_col2
, dann ist die FOREIGN KEY-Klausel ist wesentlich kompakter:
FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable
Oder, wenn Sie einen alternativen Schlüssel verweisen, nicht den Primärschlüssel:
FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable(ak_col1, ak_col2)
Dies ist Notation kompakter - so gibt es weniger Chance, es falsch zu machen - und kann durch den Server speziell sein, weil die besondere Notation bedeutet, dass es mit einem Fremdschlüssel Constraint während der allgemeinen Prüfklausel handelt muss überprüft werden, ob es einer von vielen möglichen Formen entspricht, die a Re entspricht dem Fremdschlüssel.
Die Frage fragt: wann eine Prüfbedingung und wann eine Fremdschlüsseleinschränkung verwendet werden soll?
- Verwenden Sie eine CHECK-Einschränkung, um Kriterien anzugeben, die in einer einzelnen Zeile geprüft werden können.
- Verwenden Sie eine FOREIGN KEY-Einschränkung, um anzugeben, dass die Werte in der aktuellen Zeile mit den Werten einer Zeile in einem anderen eindeutigen Schlüssel (einem Kandidatenschlüssel, normalerweise Primärschlüssel statt eines alternativen Schlüssels) einer Tabelle übereinstimmen müssen Sei die gleiche Tabelle oder (häufiger) eine andere Tabelle.
Existiert in einer anderen Tabelle ... oder in der gleichen Tabelle. –
CHECK-Bedingungen bestimmen das ..., das nicht auf Daten in einer anderen Spalte basiert. Nicht ganz korrekt, überprüfen Sie Einschränkungen können mehrere Spalten (mindestens in 10g) enthalten. Besser ist es zu sagen "nicht basierend auf Daten in einer anderen Tabelle". – Juraj