SQL删除孤儿

Ric*_*chN 3 sql oracle delete-row

假设所有外键都有适当的约束,是否有一个简单的SQL语句来删除DB中未引用的行?

简单的事情delete from the_table只是跳过包含子记录的任何行?

我试图避免手动循环表或添加类似的东西where the_SK not in (a,b,c,d).

Nic*_*int 6

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

首先使用DBMS_ERRLOG创建一个记录表(这仅仅是一个原始表与一些附加前缀列的副本:ORA_ERR_MESG$, ..., ORA_ERR_TAG$)

execute dbms_errlog.create_error_log('parent', 'parent_errlog');
Run Code Online (Sandbox Code Playgroud)

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

delete from parent
   log errors into parent_errlog ('holding-breath')
   reject limit unlimited;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"保持呼吸"评论将进入该ORA_ERR_TAG$列.

您可以在此处阅读完整的文档.

如果父表很大并且您只想删除一些杂散行,那么最终会得到一个parent_errlog基本上与表重复的parent表.如果这不好,你必须做很长的事情:

  1. 直接引用子表(遵循Tony的解决方案),或者,
  2. 循环遍历PL/SQL中的表并捕获任何异常(遵循ConfusionBob的解决方案).