2008-11-06 33 views
1

在HSQL数据库中,我有两个表(重新命名/重构用于说明目的)与HSL数据库中的多对多关系。我想被消灭了一切,当我从一个多到多关系一方删除(不包括查询表,这是性能的关键)SQL删除级联帮助(特定问题)

这里是我的主表:

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

这里是我的连接表:

CREATE TABLE JOB_PERSON 
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER 
) 

这里是我的约束:

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 

我基本上WA nt执行此操作:“删除person_id = 0的人员”,并删除PERSON,JOB_PERSON和JOB中的所有内容(如果JOB实体将被孤立)(不再在多对多表中引用)

这是可能的不查询数据库?当我删除时,它只会从PERSON和JOB_PERSON中删除。正如你可能会说,我的SQL技能缺乏。

这里是虚拟的数据我一直在玩弄:

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

所以,如果我进入这两个语句:

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

我想拥有的一切在所有3个表中删除。可能?

回答

4

创建存储过程在您传递ID的地方,然后简单地按照您需要的顺序删除适当的行。

这样,您的应用就不会受限于确切的顺序,这可能会在未来使用数据库重新设计进行更改。您还可以获得额外的奖励,即存储过程更快,然后发送一堆查询。

虽然如果您绝对想要在尝试删除该条目时删除依赖表的方法,那么必须使用触发器,但触发器的规则是,如果可能,请避免使用它们,如果存在其他解决方案,请使用它。所以最终使用Stored Proc是最好的解决方案。