2016-10-28 6 views
2

Ich habe zwei widersprüchliche Definitionen von Fremdschlüssel.Muss ein Fremdschlüssel auf einen Primärschlüssel oder einen Kandidatenschlüssel verweisen?

Von Wikipedia

the foreign key is defined in a second table, but it refers to the primary key in the first table.

Aus meiner Skriptum:

Foreign key does not have to match a primary key but must match a candidate key in some relation

, was was ist? Muss ein Fremdschlüssel auf einen Primärschlüssel oder einen Kandidatenschlüssel verweisen?

Antwort

3

Im relationalen Modell der Daten muss ein Fremdschlüssel einer Referenz Kandidat Schlüssel.

In fast allen SQL-Datenbanken muss ein Fremdschlüssel auf einen Kandidatenschlüssel verweisen.

In MySQL, a foreign key can reference just about anything.

Darüber hinaus erfordert MySQL, dass die referenzierten Spalten aus Leistungsgründen indiziert werden. Das System erzwingt jedoch keine Anforderung, dass die referenzierten Spalten UNIQUE oder NOT NULL sind.

Hervorhebung hinzugefügt.

Dies ist ein Bad Thing, IMHO.

+0

Unterstützung für Einschlussabhängigkeit Einschränkungen ist eine * gute * Sache. Die * Syntax * ist "schlecht", weil sie die Einschränkung als Fremdschlüssel bezeichnet, wenn dies nicht der Fall ist. – sqlvogel

+2

@sqlvogel: Ihre Dokumente sagen "Die Behandlung von Fremdschlüsselverweisen auf nicht eindeutige Schlüssel oder Schlüssel, die NULL-Werte enthalten, ist für Vorgänge wie UPDATE oder DELETE CASCADE nicht gut definiert. Es wird empfohlen, Fremdschlüssel zu verwenden, die nur UNIQUE (einschließlich PRIMARY) verweisen) und NOT NULL Schlüssel. " Es scheint mir, dass die MySQL-Entwickler eine schlechte Implementierung von Fremdschlüssel-Constraints statt einer guten Implementierung von Einschlussbeschränkungen durchgeführt haben. Wären nicht alle Operationen auf einer Einschlussbeschränkung klar definiert? –

+0

Guter Punkt. Das wusste ich nicht. – sqlvogel

1

Ein Fremdschlüssel muss sich auf einen eindeutigen Schlüssel beziehen (ein Primärschlüssel ist eindeutig), denn wenn dies nicht der Fall ist, kann er die Referenz von 2 Zeilen sein und ist für einen Fremdschlüssel einfach unmöglich. Dann können Sie Ihren Primärschlüssel haben, aber einen eindeutigen Schlüssel, der kein Primärschlüssel ist und einen Fremdschlüssel darauf verwendet. Und Ihr eindeutiger Schlüssel muss sein NOT NULL

3

Die Regel, dass ein FK einen "primären" Schlüssel verweisen muss, wurde von den älteren Versionen des SQL-Standards auferlegt. Diese Regel wurde inzwischen gelockert (und es ist nun zulässig, dass ein FK einen Kandidatenschlüssel referenziert), aber es kann sein, dass einige Produkte immer noch nach der alten Regel gehen, genauso wie es bei einigen Lehrbüchern der Fall sein kann andere Quellen wurden noch nicht aktualisiert, um den neuen Stand der Dinge widerzuspiegeln.

Ich weiß nicht genau wenn die Regel in dem Standard gelockert wurde, aber imo muss es sicherlich nicht später gewesen als 2003.

1

Fremdschlüssel müssen mit Kandidatenschlüsseln verknüpft werden, da bei Verknüpfung zwischen Tabellen mit Fremdschlüssel der mit einem Attribut verknüpfte FK, bei dem es sich nicht um einen Kandidatenschlüssel handelt, mehrere Werte enthalten könnte, die nur einen Wert enthalten sollten abgerufen.

Verwandte Themen