Qual è il comportamento ON DELETE predefinito di MySQL?
Domanda
Sto cercando di analizzare MySQL docs . Potrebbero essere più chiari. Quello che sembrano dire è che ci sono cinque possibilità: SET NULL, NO ACTION, RESTRICT, CASCADE e SET DEFAULT.
NESSUNA AZIONE e RESTRETTO fanno la stessa cosa (impedisce qualsiasi modifica del DB che rompe un FK) e quella cosa è l'impostazione predefinita, quindi se ometti una clausola ON DELETE stai dicendo NESSUNA AZIONE (o RESTRETTO - stessa cosa).
SET NULL consente l'eliminazione della riga principale, imposta FK su NULL.
CASCADE elimina la riga figlio.
SET DEFAULT non dovrebbe mai essere usato.
È più o meno corretto?
Soluzione
Sì, è corretto:
NESSUNA AZIONE : [...] InnoDB rifiuta l'operazione di eliminazione o aggiornamento per la tabella padre.
RESTRICT : rifiuta l'eliminazione o l'aggiornamento operazione per la tabella padre. Specificare RESTRICT (o NO AZIONE) è lo stesso che omettere ON DELETE o Clausola ON UPDATE. [...]
Apparentemente NESSUNA AZIONE
e RESTRICT
sono sinonimi. Inoltre, poiché vengono utilizzati ogni volta che non esiste una clausola ON DELETE / UPDATE
, questo è il comportamento predefinito.
SET NULL : elimina o aggiorna la riga dalla tabella principale e imposta il colonna o colonne di chiave esterna in tabella figlio su NULL. [...]
La colonna esterna è impostata su NULL, a condizione che non sia dichiarata come NOT NULL (o InnoDB non consentirà l'eliminazione o l'aggiornamento).
CASCADE : elimina o aggiorna la riga dalla tabella padre e elimina o aggiorna automaticamente il file righe corrispondenti nella tabella figlio. [...]
La cascata elimina (o aggiorna) la colonna esterna.
IMPOSTA DEFAULT : questa azione è riconosciuta dal parser, ma InnoDB rifiuta definizioni di tabella contenenti ON DELETE SET DEFAULT o ON UPDATE SET DEFAULT clausole.
Quindi sostanzialmente non puoi usare quell'opzione.