我有两个表(出于说明目的重命名/重构),它们在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,然后按照需要的顺序简单地删除适当的行。
这样,您的应用就不受确切顺序的束缚,将来随着数据库的重新设计而改变。您还获得了额外的好处,即存储过程更快,然后发送了一堆查询。
尽管如果您绝对希望在尝试删除该表时删除该表的方法,则必须使用触发器,但是触发器的规则是,请尽可能避免使用它们,如果存在其他解决方案,请使用它。因此,最终,使用存储过程是最好的解决方案。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。