Ich glaube, Sie missverstehen, was ON DELETE NO ACTION
bedeutet meint. Das tut es nicht bedeuten, die Foreign-Key-Einschränkung zu unterdrücken.
Wenn Sie einen Datensatz löschen, auf den durch einen Fremdschlüssel verwiesen wird, kann InnoDB eine automatische Maßnahme ergreifen, um die Situation zu korrigieren:
- es kann
CASCADE
, was bedeutet, den verweisenden Datensatz löschen. (Dies wäre sinnvoll für etwas wieuser_address.user_id
. Wenn Sie einen Benutzer endgültig löschen, möchten Sie wahrscheinlich auch alle Adressen des Benutzers endgültig löschen.) - es kann
SET NULL
, was bedeutet, den verweisenden Schlüssel löschen. (Dies könnte für etwas wiefile.last_modified_by
sinnvoll sein . Wenn Sie einen Benutzer endgültig löschen, möchten Sie möglicherweise, dass der letzte Änderungsstatus der Datei einfach "unbekannt" wird.)
Wenn Sie NO ACTION
angeben , teilen Sie InnoDB mit, dass Sie keine dieser Aktionen ausführen möchten. InnoDB kann die Situation also nicht für Sie beheben; alles, was es tun kann, ist das DELETE
abzulehnen und einen Fehler zurückgeben.
Als Ergebnis ON DELETE NO ACTION
ist eigentlich dasselbe wie ON DELETE RESTRICT
(Standardeinstellung).
(Hinweis:In einigen DBMS und in Standard-SQL ist ON DELETE NO ACTION
unterscheidet sich etwas von ON DELETE RESTRICT
:in diesen ON DELETE NO ACTION
bedeutet "akzeptiere das DELETE
innerhalb der aktuellen Transaktion, aber lehne die gesamte Transaktion ab, wenn ich versuche, sie festzuschreiben, bevor ich das Problem behebe.“ Aber InnoDB unterstützt keine verzögerten Prüfungen, also behandelt es ON DELETE NO ACTION
genau dasselbe wie ON DELETE RESTRICT
, und lehnt immer das DELETE
ab sofort .)
Siehe §§14.2.2.5 "FREMDER SCHLÜSSEL Einschränkungen" und 13.1.17.2 "Using FOREIGN KEY Constraints " im MySQL 5.6 Referenzhandbuch.