2010-04-11 3 views
8

Ich bin ziemlich verwirrt über den Unterschied zwischen einer FOREIGN KEY und CHECK-Einschränkung - sie scheinen mir das gleiche Ergebnis zu erzielen.Was ist der Unterschied zwischen Scheck und Fremdschlüssel?

Ich meine, ich könnte eine Tabelle erstellen und einen Fremdschlüssel in einer anderen Tabelle erzwingen, aber ich könnte eine Überprüfung erstellen, um den Wert in einer anderen Tabelle zu gewährleisten.

Was ist der Unterschied und wann man den einen oder anderen benutzt?

Antwort

6

ein Fremdschlüssel constrain stellt sicher, dass der Eintrag

EDIT vor DOES eine andere Tabelle

per richtigen Kommentar in einer anderen Tabelle existiert ... oder derselben Tabelle. - Mark Byers

Ein CHECK-Constrain stellt sicher, dass der Eintrag einer Regel folgt.

CHECK Constraints

CHECK-Einschränkungen Domäne Integrität erzwingen, indem die Werte zu begrenzen, die durch eine 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-Constraints erhalten die Liste gültiger Werte aus einer anderen Tabelle, und CHECK-Constraints bestimmen die gültigen Werte aus einem logischen Ausdruck, der nicht auf Daten in einer anderen Spalte basiert.

+4

Existiert in einer anderen Tabelle ... oder in der gleichen Tabelle. –

+0

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

2

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). Das bedeutet, dass die Liste der Werte sich ändert - größer oder kleiner wird - 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 sich darauf bezieht, was richtige Joins bilden sollen.

Es empfiehlt sich, zuerst die Fremdschlüssel (und die unterstützenden 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.

+2

Fremdschlüssel müssen keine einzelnen Spaltenschlüssel sein. –

1

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.
Verwandte Themen