【问题标题】:DELETE with two joined table删除两个连接表
【发布时间】:2016-07-09 02:25:27
【问题描述】:

我有两个表 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_NOTIFID_PJ

解决方案:

我通过在ID_PJPJ_BY_NOTIF 的外键上添加on delete cascade 找到了一种方法

【问题讨论】:

  • 请标记您正在使用的RDBMS。
  • @User3469203 您的解决方案中有一个循环存在问题......您将如何使用这种方法从 PJ_GEN 表中删除?
  • 我做了两个声明:首先我从 PJ_GEN 中删除,然后从 PJ_BY_NOTIF 中删除(感谢 ON DELETE CASCADE)。然后我从 NOTIF 中删除。

标签: sql oracle11g sql-delete jointable


【解决方案1】:

在这种情况下,您可以先使用NOTIF 加入PJ_BY-NOTIF 的条件从PJ_GEN 表中删除 喜欢

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

【讨论】:

  • 第一条语句不起作用,因为 PJ_GEN 中有一个引用 NOTIF 主键的外键:'java.sql.SQLIntegrityConstraintViolationException: ORA-02292: 完整性约束 违反 - 找到子记录
  • 请检查您是否有任何其他表引用 PJ_GEN 表 .. 因为正如您所说的 PJ_GEN 中有外键,那么首先从该表中删除行应该没问题.. 因为这将被考虑在这种情况下作为子表..
  • 还有一件事..请再次检查..因为您提到它具有多对多关系,它不应该与 PJ_GEN 和 NOTIF 有任何关系..这种关系应该只完成通过您已经在使用的一张中间表PJ_BY_NOTIF
  • 没有其他表引用 PJ_GEN。我在 PJ_BY_NOTIF 中只有外键,在 PJ_GEN 中没有。没错,关系只有 PJ_BY_NOYIF 完成。
  • 是的。如果您有外键,那么在这种情况下,您应该在定义外键时使用ON DELETE CASCADE 来实现此要求。
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多