Java SQL删除级联帮助(特定问题)

Java SQL删除级联帮助(特定问题),java,sql,jdbc,constraints,hsqldb,Java,Sql,Jdbc,Constraints,Hsqldb,我在HSQL数据库中有两个具有多对多关系的表(为了说明目的而重命名/重构)。当我从多对多关系的一侧删除时,我希望所有内容都被删除(不查询表;这是性能关键) 以下是我的主要表格: CREATE TABLE PERSON ( PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, NAME VARCHAR(50) ) CREATE TABLE JOB ( JOB_ID INTEGER GENERATE

我在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\u id=0的person中删除”,并让它删除person、JOB\u 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个表中的所有内容。可能吗?

创建一个存储过程,在其中传递ID,然后按需要的顺序删除相应的行

这样一来,你的应用程序就不会与确切的顺序绑定,将来DB重新设计可能会改变这种顺序。您还可以获得额外的好处,即存储过程比发送一系列查询更快


尽管在尝试删除依赖表项时,如果您确实想要一种删除依赖表的方法,那么您必须使用触发器,但触发器的规则是,尽可能避免使用它们,如果存在其他解决方案,请使用它。因此,最终,使用存储过程是最好的解决方案。

创建一个存储过程,在其中传递ID,然后按照需要的顺序删除适当的行

这样一来,你的应用程序就不会与确切的顺序绑定,将来DB重新设计可能会改变这种顺序。您还可以获得额外的好处,即存储过程比发送一系列查询更快

尽管在尝试删除依赖表项时,如果您确实想要一种删除依赖表的方法,那么您必须使用触发器,但触发器的规则是,尽可能避免使用它们,如果存在其他解决方案,请使用它。因此,最终,使用存储过程是最好的解决方案