Myslím, že nerozumíte tomu, co ON DELETE NO ACTION
prostředek. není znamená potlačit omezení cizího klíče.
Když smažete záznam, na který se odkazuje cizí klíč, InnoDB má možnost provést automatickou akci k nápravě situace:
- může
CASCADE
, což znamená smazat odkazující záznam. (To by dávalo smysl pro něco jakouser_address.user_id
. Pokud uživatele natvrdo smažete, pravděpodobně budete chtít natvrdo smazat také všechny adresy tohoto uživatele.) - může
SET NULL
, což znamená, vymazat odkazující klíč. (To může mít smysl pro něco jakofile.last_modified_by
. Pokud uživatele natvrdo smažete, možná budete chtít, aby se poslední změna souboru jednoduše stala „neznámou“.)
Pokud zadáte NO ACTION
, říkáte InnoDB, že nechcete, aby provedl žádnou z těchto akcí. Takže InnoDB nemůže situaci vyřešit za vás; vše, co může udělat, je odmítnout DELETE
a vrátí chybu.
V důsledku toho ON DELETE NO ACTION
je ve skutečnosti stejné jako ON DELETE RESTRICT
(výchozí).
(Poznámka:v některých DBMS a ve standardním SQL ON DELETE NO ACTION
se trochu liší od ON DELETE RESTRICT
:v nich ON DELETE NO ACTION
znamená „přijmout DELETE
v rámci aktuální transakce, ale odmítnout celou transakci, pokud se ji pokusím potvrdit před nápravou problému." InnoDB však nepodporuje odložené kontroly, takže zachází s ON DELETE NO ACTION
přesně stejné jako ON DELETE RESTRICT
a vždy odmítá DELETE
okamžitě .)
Viz §§14.2.2.5 "CIZI KLÍČ Omezení" a 13.1.17.2 "Použití omezení FOREIGN KEY " ." v Referenční příručce MySQL 5.6.