Ciao a tutti,
faccio pesante uso della integrita' referenziale e delle clausole ON DELETE CASCADE, quando servono, per abitudine, e mi sono trovato un attimo fa davanti a un problema assolutamente inatteso.
Supponiamo di avere questo semplice schema:
codice:
Tabella CLIENTI (ID, Nome, Cognome)
Tabella ACQUISTI (ID, IDCliente, Data)
ACQUISTI: IDCliente FOREIGN KEY REFERENCES CLIENTI.ID ON DELETE CASCADE
Se faccio DELETE FROM CLIENTI WHERE ID=1, elimina sia il cliente sia tutti i suoi acquisti, esattamente come mi aspettavo.
Supponiamo ora di aggiungere:
codice:
Tabella FATTURE (ID, IDCliente, Importo
FATTURE: IDCliente FOREIGN KEY REFERENCES CLIENTI.ID (niente
cascade).
A questo punto, se faccio DELETE FROM CLIENTI WHERE ID=1, la query viene bloccata perche' mi dice che viene violato un vincolo di integrita'.
Ebbene, davo per *SCONTATO* che facendo DELETE FROM CLIENTI WHERE ID=1 CASCADE, ottenessi una eliminazione forzata di tutte le sotto tabelle, incluse quelle che non hanno ON DELETE CASCADE, ma guardando il manuale di MySQL non c'e' alcuna traccia di uno statement DELETE FROM TABELLA WHERE [...] CASCADE, ne' di altri simili, tipo DELETE CASCADE FROM TABELLA WHERE [...].
Come e' possibile? Sono io che davo per ovvio una cosa che mi pareva ovvio che fosse SQL standard (dagli studi universitari), oppure sono quelli di MySQL che sono dei cazzoni e hanno implementato male il CASCADE ?
Personalmente davo per assolutamente scontato che un DELETE FROM TABELLA CASCADE eliminasse tutte le tabelle correlate da foreign key alla tabella padre in cascata, e che la clausola ON DELETE CASCADE fosse solo una comodita' in piu' . Altrimenti, che senso ha? Non posso fare un DELETE in cascata se lo schema del database non lo permette? Mi sembra una stronzata immensa...
Ditemi che non e' cosi' e che sto sbagliando qualcosa di ovvio, per favore!!!