Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Nur ein Schlüssel aus zusammengesetztem Primärschlüssel als Fremdschlüssel

Diese Antwort nimmt die Frage „Füge einen Fremdschlüssel zu table3 hinzu " bedeutet, dass ein FK (Fremdschlüssel) in table3 hinzugefügt wurde Verweis auf eine der Spalten des zusammengesetzten PK (Primärschlüssel) von table4 . In Standard-SQL kann ein FK auf eine richtige/kleinere Teilmenge eines PK verweisen.

Diese andere Antwort nimmt vermutlich "Füge einen Fremdschlüssel zu table3 hinzu " bedeutet, dass ein FK in table4 hinzugefügt wurde wobei eine der Spalten des PK auf table3 verweist . Ein FK-Spaltensatz in einer Tabelle ist unabhängig von darin enthaltenen PK- oder UNIQUE-Deklarationen.

In Standard-SQL kann ein FK auf eine richtige/kleinere Teilmenge eines PK verweisen.

Die referenzierte Spaltenliste muss als PRIMARY KEY oder UNIQUE deklariert werden. (PRIMARY KEY erstellt eine UNIQUE NOT NULL-Einschränkung.) (Die Einschränkung muss explizit sein, auch wenn jeder Satz von NOT NULL-Spalten, der einen UNIQUE-Satz enthält, eindeutig sein muss.)

Leider lässt MySQL zu, dass Sie einen FK deklarieren, der auf eine Spaltenliste verweist, die nicht EINZIGARTIG ist. Obwohl ein solches FK oder eines, das Nicht-NULL-Spalten referenziert (OK in Standard-SQL), nicht richtig implementiert ist und die Dokumentation selbst davon abrät:

(Sie können darüber nachdenken, was wohldefinierte Operationen sind und was nicht, da die Dokumentation nicht wirklich klarstellt.)

1.8.2.3 Fremdschlüsselunterschiede
13.1.18 TABELLE ERSTELLEN Syntax
13.1.18.6 Verwendung von FOREIGN WICHTIGE Einschränkungen

PS:Relational vs. SQL

Im relationalen Modell referenziert ein FK einen CK (Kandidatenschlüssel). Ein Superkey ist ein eindeutiger Spaltensatz. Ein CK ist ein Superschlüssel, der keinen kleineren Superschlüssel enthält. Ein CK kann als PK (Primärschlüssel) bezeichnet werden. Wenn die Werte eines Spaltensatzes an anderer Stelle erscheinen müssen, sprechen wir von einer IND (Inclusion Dependency). Ein FK ist ein IND zu einem CK. Wenn ein IND zu einem Superschlüssel gehört, könnten wir das einen "fremden Superschlüssel" nennen.

Ein SQL PK oder UNIQUE NOT NULL deklariert einen Superschlüssel. Es ist ein CK, wenn es keinen kleineren Spaltensatz enthält, der als SQL PK deklariert ist oder UNIQUE NOT NULL . SQL FK deklariert einen fremden Superschlüssel. Ein SQL-PK könnte also tatsächlich sein ein relationales PK (daher CK) und ein UNIQUE NOT NULL könnten tatsächlich sein ein CK. Ein SQL FK zu einem dieser ist tatsächlich ein relationales FK.