Salve a tutti,
per spiegare il problema riporto un esempio:
Quindi ho tre tabella, una figlia(collega) e le altre due padre.codice:create table persona( id integer primary key auto_increment, nome varchar(20) ); create table recapito( id integer primary key auto_increment, recapito varchar(20) ); create table collega( id integer primary key auto_increment, id_persona integer, id_recapito, foreign key (id_persona) references persona(id) on delete restrict, foreign key (id_recapito) references recapito(id) on delete restrict );
Ora dovrei realizzare una query che cancelli una persona(ovviamente anche tutti i suoi recapiti).
Io credevo che il delete eliminasse le tuple in base all' ordine delle tabelle che vengono messe di seguito a "DELETE", invece leggendo in giro ho scoperto che è come se le eliminasse tutte insieme, quindi per i vincoli è un problema, nel senso che quella query funzionerebbe solamente se vengono eliminate le tuple delle tabelle padri e poi quelle della tabella figlia, altrimente il vincolo on delete restrict farebbe restituire un errore.codice:DELETE persona, recapito, collega FROM persona left join collega on persona.id=collega.id_persona left join recapito on recapito.id=collega.id_recapito WHERE persona.id = 1;
La soluzione potrebbe essere quella di eseguire 2 query, per eliminare le tuple sulle tabelle padri e poi su quella figlia, ma mi sembrerebbe poco elegante come soluzione.
Voi come mi suggerireste di fare?
p.s.: c'è il vincolo on delete restrict per evitare che vadano a buon fine query come questa:
delete from collega where id=1;
p.p.s: mettendo il cascade anziché il restict la seguente query:
delete from collega where id_persona = 1;
dovrebbe eliminare anche le tuple nelle tabelle padri giusto? Come la considerate questa alternativa?
A me sinceramente non piace molto, anche per la leggibilità delle query....

Rispondi quotando