【问题标题】:How to carry out deletions from 2 tables, at the same time in Oracle database?如何在 Oracle 数据库中同时从 2 个表中执行删除?
【发布时间】:2016-10-03 14:53:57
【问题描述】:

在我的Oracle 数据库中,我希望从 2 个不同的表中删除行。

问题是,如果我先从 KENNEL 中删除行,那么我想在 DOG 表中删除的行找不到删除。

下面是我要从两个表中删除的SQL statements

DELETE FROM KENNEL WHERE COUNTRY_ID IS NULL;
DELETE FROM DOG WHERE ID IN (SELECT DOG_ID FROM KENNEL WHERE COUNTRY_ID IS NULL);

我该如何解决这个问题,以便 2 次删除同时发生,并确保两个表中的行都被删除?

注意:我不能从 DOG 然后 KENNEL 中删除,因为 KENNEL 是必须首先删除的子记录。

【问题讨论】:

  • 您可以简单地先从 DOG 中删除,然后从 KENNEL 中删除,并处理异常以在出现错误时回滚两个语句
  • 我不能这样做,因为 DOG 和 KENNEL 之间存在约束,必须先删除 kennel,因为它是子记录
  • 您的桌子上有哪些限制?请发布所有涉及约束的代码
  • 为什么不能直接从 kennel 中删除,然后从 kennel 表中不存在 id 的 dog 中删除?这听起来是最简单的方法。这样,如果 kennel 表中仍有子记录,则在尝试从 dog 表中删除行时不会出错。或者,首先将 id 提取到集合或全局临时表 (GTT) 中,然后使用它作为删除的基础。
  • @Boneist 谢谢我试试看,或者我可以使用 join 语句从 2 个模式中执行删除吗?

标签: oracle transactions oracle-sqldeveloper sql-delete


【解决方案1】:

我会将这组删除操作如下:

-- delete rows from child table first
DELETE FROM KENNEL WHERE COUNTRY_ID IS NULL;

-- now delete any parent rows that don't have any child records
DELETE FROM DOG WHERE ID not exists (SELECT DOG_ID FROM KENNEL);

这样做意味着如果 kennel 表中给定 dog_id 的所有 country_id 都不是 null,您将不会尝试删除父记录 - 如果您尝试会出错。

【讨论】:

    【解决方案2】:
    UPDATE DOG SET [some non-key field] = 'XXX' WHERE ID IN (SELECT DOG_ID FROM KENNEL WHERE COUNTRY_ID IS NULL);
    
    DELETE FROM KENNEL WHERE COUNTRY_ID IS NULL;
    
    DELETE FROM DOG WHERE [non-key field] = 'XXX';
    

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 2013-06-17
    • 2010-12-03
    • 2015-12-19
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2020-03-12
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多