我有两张NOTIF和PJ_GEN这样定义的表:
TABLE NOTIF
==========
ID_NOTIF
COD_ONE
LIB
DATE
TABLE PJ_GEN
==========
ID_PJ
COD_TWO
LIB_TWO
这个表定义了多对多的关联:
PJ_BY_NOTIF
==========
ID_NOTIF
ID_PJ
我想写一个删除所有表的请求,从NOTIF表开始。我的基本要求是:
DELETE * FROM NOTIF WHERE DATE < ? AND COD_ONE = 3;
如何更新此请求两次删除已连接的表PJ_GEN和PJ_BY_NOTIF?
PJ_BY_NOTF有两个外键:ID_NOTIF
和ID_PJ
解决方案:
我找到了一种方法,在on delete cascade
ID_PJ
外键上添加PJ_BY_NOTIF
答案 0 :(得分:0)
在这种情况下,您可以先使用PJ_GEN
加入NOTIF
的条件从PJ_BY-NOTIF
表中删除
喜欢
Delete from PJ_GEN where ID_PJ in
(select ID_PJ from PJ_BY_NOTIF ,NOTIF
where NOTIF.ID_NOTIF = PJ_BY_NOTIF.ID_NOTIF
and NOTIF.DATE < ? AND COD_ONE = 3);
然后您可以发出一个删除语句从PJ_BY_NOTIF
表中删除以删除多对多关联
DELETE from PJ_BY_NOTIF WHERE ID_PJ IN
( SELECT ID_PJ
FROM NOTIF
WHERE NOTIF.DATE < ? AND COD_ONE = 3);
:编辑:如果中间表PJ_BY_NOTIF
中存在外键,那么您需要确保已使用ON DELETE CASCADE
约束定义外键,否则请执行这种变化。如果定义了ON DELETE CASCADE
,那么这将自动从子表中删除相应的子记录,并且不需要使用第二个删除语句。
编辑2 - 但由于在这种情况下维持了多对多的关系,这会干扰与其他值的关系。
这意味着如果您有一个ID_PJ
定义了两个ID_NOTIF
,其中一个NOTIF将从主表中删除,因此您尝试根据您的条件从PJ_GEN中删除。但由于另一个ID_NOTIF也与此ID_PJ相关联,因此您应跳过此特定ID_PJ以从PJ_GEN表中删除。
然后从NOTIF
表中删除。
DELETE FROM NOTIF
WHERE NOTIF.DATE < ? AND COD_ONE = 3