gpt4 book ai didi

SQL删除孤儿

转载 作者:行者123 更新时间:2023-12-04 16:00:33 25 4
gpt4 key购买 nike

假设所有外键都有适当的约束,是否有一个简单的 SQL 语句来删除数据库中任何地方都没有引用的行?

delete from the_table 这样简单地跳过任何带有子记录的行?

我试图避免手动循环遍历表格或添加类似 where the_SK not in (a,b,c,d) 之类的内容。

最佳答案

您也许可以使用 10g 中包含错误日志记录的扩展 DELETE 语句。

首先使用 DBMS_ERRLOG 创建一个日志表(它只是原始表的副本,带有一些附加的前缀列:ORA_ERR_MESG$, ..., ORA_ERR_TAG$ )

execute dbms_errlog.create_error_log('parent', 'parent_errlog');

现在,您可以使用 delete 语句的 LOG ERRORS 子句来捕获所有具有现有完整性约束的行:

delete from parent
log errors into parent_errlog ('holding-breath')
reject limit unlimited;

在这种情况下,“holding-breath”注释将进入 ORA_ERR_TAG$ 列。

您可以阅读完整的文档 here .

如果父表很大并且您只想删除一些杂散行,那么您最终会得到一个 parent_errlog 表,它本质上是您的 parent表。如果这不行,您将不得不做很长的路要走:

  1. 直接引用子表(在 Tony's solution 之后),或者,
  2. 在 PL/SQL 中循环遍历表并捕获任何异常(在 Confusion'sBob's solutions 之后)。

关于SQL删除孤儿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2026289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com