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.