Ich habe eine Tabelle, die mehrere ID-Spalten zu anderen Tabellen hat.
Ich möchte, dass ein Fremdschlüssel die Integrität nur erzwingt , wenn ich dort Daten eingebe. Wenn ich zu einem späteren Zeitpunkt ein Update durchführe, um diese Spalte zu füllen, sollte auch die Einschränkung überprüft werden.
(Dies ist wahrscheinlich datenbankserverabhängig. Ich verwende den Tabellentyp MySQL & InnoDB.)
Ich glaube, das ist eine vernünftige Erwartung, aber korrigiere mich, wenn ich falsch liege.
sql
mysql
database
foreign-keys
Bender
quelle
quelle
Antworten:
Ja, Sie können die Einschränkung nur erzwingen, wenn der Wert nicht NULL ist. Dies kann leicht anhand des folgenden Beispiels getestet werden:
Die erste Einfügung wird übergeben, da wir eine NULL in die einfügen
parent_id
. Die zweite Einfügung schlägt aufgrund der Fremdschlüsseleinschränkung fehl, da wir versucht haben, einen Wert einzufügen, der in derparent
Tabelle nicht vorhanden ist .quelle
parent_id INT NULL
Teil ist (wörtlich) gleichparent_id int default null
int
anstelleInteger
Ihrer Klassenmitglieder verwenden, ist der Standardwert niemals null, sondern 0, und Sie werden die Einschränkung nicht erfüllen.Ich habe festgestellt, dass beim Einfügen die Nullspaltenwerte speziell als NULL deklariert werden müssen, da sonst ein Fehler bei der Einschränkung von Einschränkungen angezeigt wird (im Gegensatz zu einer leeren Zeichenfolge).
quelle
INSERT INTO {table} {list_of_columns}
? Weil das für mich gilt; Das Auslassen der Erwähnung der Spalte führt zu einem Fehler, aber das Einschließen und explizite Setzen auf NULL behebt den Fehler. Wenn ich richtig liege, denke ich, dass @ Garys Kommentar nicht zutrifft (weil Sie keine leere Zeichenfolge gemeint haben), aber @ Kevin Coulombes könnte hilfreich sein ...Ja, das wird so funktionieren, wie Sie es erwarten. Leider scheint es mir schwer zu fallen, eine explizite Aussage dazu im MySQL-Handbuch zu finden .
Fremdschlüssel bedeuten, dass der Wert in der anderen Tabelle vorhanden sein muss. NULL bezieht sich auf das Fehlen eines Werts. Wenn Sie also eine Spalte auf NULL setzen, ist es nicht sinnvoll, zu versuchen, diesbezügliche Einschränkungen durchzusetzen.
quelle
Das obige funktioniert, aber das funktioniert nicht. Beachten Sie die KASKADE EIN LÖSCHEN
quelle
Ja, der Wert kann NULL sein, aber Sie müssen explizit sein. Ich habe die gleiche Situation schon einmal erlebt, und es ist leicht zu vergessen, WARUM dies geschieht. Daher dauert es ein wenig, sich daran zu erinnern, was zu tun ist.
Wenn die übermittelten Daten als leere Zeichenfolge umgewandelt oder interpretiert werden, schlägt dies fehl. Wenn Sie den Wert beim EINFÜGEN oder AKTUALISIEREN jedoch explizit auf NULL setzen, können Sie loslegen.
Aber das ist der Spaß am Programmieren, nicht wahr? Erstellen Sie unsere eigenen Probleme und beheben Sie sie dann! Prost!
quelle
Eine andere Möglichkeit, dies zu umgehen, besteht darin, ein DEFAULT-Element in die andere Tabelle einzufügen. Beispielsweise würde ein Verweis auf uuid = 00000000-0000-0000-0000-000000000000 in der anderen Tabelle keine Aktion anzeigen. Sie müssen auch alle Werte für diese ID auf "neutral" setzen, z. B. 0, leere Zeichenfolge, null, um Ihre Codelogik nicht zu beeinflussen.
quelle
Ich habe mich auch an dieses Thema gehalten. Aber ich habe es einfach gelöst, indem ich den Fremdschlüssel als definiert habe
unsigned integer
. Finden Sie das folgende Beispiel-quelle