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

Warum Fremdschlüssel ohne Aktion beim Löschen oder Aktualisieren verwenden

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 wie user_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 wie file.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.