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

Ordine di eliminazione con vincoli di chiave esterna,

Ufficialmente, non hai alcun controllo sull'ordine delle operazioni a cascata. Potresti essere in grado di abusare di alcuni non documentati comportamento comunque:

  • per MySQL 5.5, le chiavi esterne vengono eseguite nell'ordine in cui sono state create, quindi rilasciando e ricreando il fk_category_org -il vincolo dovrebbe funzionare
  • per MySQL 5.6+, le chiavi esterne vengono eseguite nell'ordine lessicale dei loro nomi, quindi rinominando fk_category_org ad es. fk_z_category_org dovrebbe funzionare

Questo non è documentato e può cambiare in qualsiasi momento (e potrebbe essere influenzato da altri fattori).

Detto questo, il modo corretto per farlo (e qualsiasi altra cosa troppo complicata per on cascade ) sarebbe aggiungere un before delete -trigger sulla tua organisation -tabella che "manualmente" cancella prima gli utenti e poi le categorie. before delete -i trigger vengono eseguiti prima di on cascade (quindi puoi decidere se tenerli o meno, anche se probabilmente sarebbe fuorviante).

Non è del tutto chiaro se questo è il tuo comportamento intenzionale, ma attualmente un utente può avere una categoria che appartiene all'organizzazione 1 mentre è assegnato all'organizzazione 2. L'eliminazione dell'organizzazione 1 fallirebbe comunque. Sembra un po' come se questo sia ciò che vuoi evitare con il tuo design, ma se vuoi che l'eliminazione funzioni anche in questo caso, è necessario per utilizzare il trigger per poterlo incorporare (o eliminarlo manualmente nella tua applicazione), il collegamento a cascata non funzionerà a meno che tu non lo faccia anche nella tabella delle categorie.