Domanda

Ho due tabelle (rinominate / refactored a scopo illustrativo) con una relazione Many-To-Many in un database HSQL. Voglio che tutto venga cancellato quando elimino da una parte della relazione Many-to-Many (senza interrogare la tabella; questo è un fattore critico per le prestazioni)

Ecco le mie tabelle principali:

CREATE TABLE PERSON
(
    PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

CREATE TABLE JOB
(
    JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

Ecco la mia tabella di join:

CREATE TABLE JOB_PERSON
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER
)

Ecco i miei vincoli:

ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE JOB_PERSON ADD
    CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID) 
    REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE

Fondamentalmente voglio farlo: " elimina dalla persona dove person_id = 0 " e fai eliminare tutto da PERSON, JOB_PERSON e JOB se l'entità JOB sarà rimasta orfana (non più referenziata nella tabella dalle molte alle molte)

È possibile senza interrogare il database? Quando elimino, viene eliminato solo da PERSON e JOB_PERSON. Come probabilmente puoi dire, mancano le mie competenze sql.

Ecco i dati fittizi con cui ho giocato:

insert into person values(null,'Arthur');
insert into person values(null,'James');
insert into job values(null, 'Programmer')
insert into job values(null, 'Manager')
insert into job_person values(0,0);
insert into job_person values(0,1);
insert into job_person values(1,1);

Quindi, se inserisco entrambe queste affermazioni:

delete from person where person_id=0
delete from person where person_id=1

Vorrei cancellare tutto in tutte e 3 le tabelle. Possibile?

È stato utile?

Soluzione

Crea una procedura di archiviazione in cui passi l'ID, quindi elimina semplicemente la riga corretta nell'ordine necessario.

In questo modo la tua app non è legata all'ordine esatto, che potrebbe cambiare in futuro con la riprogettazione dei DB. Ottieni anche il bonus aggiuntivo che i Procs memorizzati sono più veloci dell'invio di un sacco di domande.

Anche se se si desidera assolutamente un modo per eliminare le tabelle dipendenti quando si tenta di eliminare quella voce, è necessario utilizzare i trigger, ma la regola per i trigger è, evitarli ogni volta che è possibile, se esiste un'altra soluzione, utilizzarla. Quindi, in definitiva, utilizzare uno Stored Proc è la soluzione migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top