Mysql
 sql >> Database >  >> RDS >> Mysql

Perché utilizzare chiavi esterne senza alcuna azione su eliminazione o aggiornamento

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