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....