2008-11-06 6 views
1

J'ai deux tables (renommées/refactorisées à des fins d'illustration) avec une relation plusieurs-à-plusieurs dans une base de données HSQL. Je veux que tout soit effacé lorsque je supprime d'un côté d'une relation Many-to-Many (sans interroger la table, ce qui est la performance critique)Aide en cascade de suppression SQL (question spécifique)

Voici mes tableaux principaux:

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

ici est ma table de jointure:

CREATE TABLE JOB_PERSON 
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER 
) 

Voici mes contraintes:

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 

Je essentiellement wa nt pour faire ceci: "supprimer de la personne où person_id = 0" et lui faire supprimer tout de PERSON, JOB_PERSON et JOB si l'entité JOB sera orphelin (n'est plus référencé dans la table many to many)

Est-ce possible sans interroger la base de données? Quand je supprime, il supprime seulement de PERSON et JOB_PERSON. Comme vous pouvez probablement le dire, mes compétences sql manquent.

Voici les données mannequin Je joue autour avec:

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); 

Donc, si j'entre ces deux déclarations:

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

Je voudrais tout avoir dans les 3 tables supprimées . Possible?

Répondre

4

Créer une procédure de magasin où vous passez l'ID, puis simplement SUPPRIMER la ligne appropriée dans l'ordre dont vous avez besoin.

De cette façon, votre application n'est pas liée à l'ordre exact, ce qui pourrait changer à l'avenir avec les reconceptions de BD. Vous bénéficiez également du bonus supplémentaire que les processus stockés sont plus rapides, puis l'envoi d'un tas de requêtes. Bien que si vous vouliez absolument un moyen de supprimer les tables dépendantes lorsque vous essayez de supprimer cette entrée, vous devez utiliser des déclencheurs, mais la règle pour les déclencheurs est, évitez-les autant que possible, si une autre solution existe, utilisez-la. Donc, en fin de compte, en utilisant un processus stocké est la meilleure solution.