Penso che tu stia fraintendendo cosa ON DELETE NO ACTION
si intende. non significa sopprimere il vincolo di chiave esterna.
Quando elimini un record a cui fa riferimento una chiave esterna, InnoDB ha la possibilità di intraprendere un'azione automatica per correggere la situazione:
- può
CASCADE
, ovvero eliminare il record di riferimento. (Questo avrebbe senso per qualcosa comeuser_address.user_id
. Se elimini definitivamente un utente, probabilmente vorrai eliminare definitivamente anche tutti gli indirizzi dell'utente.) - può
SET NULL
, che significa, cancellare la chiave di riferimento. (Questo potrebbe avere senso per qualcosa comefile.last_modified_by
. Se elimini definitivamente un utente, potresti volere che l'ultima modifica del file diventi semplicemente "sconosciuto".)
Se specifichi NO ACTION
, stai dicendo a InnoDB che non vuoi che esegua nessuna di queste azioni. Quindi InnoDB non può risolvere la situazione per te; tutto ciò che può fare è rifiutare il DELETE
e restituisce un errore.
Di conseguenza, ON DELETE NO ACTION
è in realtà lo stesso di ON DELETE RESTRICT
(l'impostazione predefinita).
(Nota:in alcuni DBMS e in SQL standard, ON DELETE NO ACTION
è leggermente diverso da ON DELETE RESTRICT
:in quelli, ON DELETE NO ACTION
significa "accetta il DELETE
all'interno della transazione corrente, ma rifiuta l'intera transazione se provo a eseguirla prima di correggere il problema". Ma InnoDB non supporta i controlli differiti, quindi tratta ON DELETE NO ACTION
esattamente come ON DELETE RESTRICT
e rifiuta sempre il DELETE
immediatamente .)
Vedere §§14.2.2.5 "CHIAVE ESTERA Vincoli" e 13.1.17.2 "Utilizzo dei vincoli CHIAVE ESTERA " nel Manuale di riferimento di MySQL 5.6.