我在HSQL数据库中有两个表(为了说明目的而重命名/重构),具有多对多关系。当我从多对多关系的一边删除(不查询表格,这是性能关键的)时,我希望一切都被消灭。

以下是我的主要表格:

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

我基本上想要这样做:“从person_id = 0的人中删除”如果JOB实体将被孤立(不再在多对多表中引用),则从PERSON,JOB_PERSON和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个表中的所有内容。可能的?

有帮助吗?

解决方案

创建一个存储过程,您可以在其中传递ID,然后按照您需要的顺序删除正确的行。

通过这种方式,您的应用程序与确切的顺序无关,以后可能会在DB重新设计时更改。您还可以获得额外的好处,即存储过程比发送大量查询更快。

虽然如果您在尝试删除该条目时绝对想要一种删除依赖表的方法,但必须使用触发器,但触发器的规则是,尽可能避免使用它们,如果存在其他解决方案,请使用它。因此,最终使用存储过程是最佳解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top