Salve a tutti,
per spiegare il problema riporto un esempio:
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
);
Quindi ho tre tabella, una figlia(collega) e le altre due padre.
Ora dovrei realizzare una query che cancelli una persona(ovviamente anche tutti i suoi recapiti).
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;
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.
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....