Sql Oracle-忽略约束失败

Sql Oracle-忽略约束失败,sql,oracle,Sql,Oracle,我有一个包含许多行的“staff”表,我希望从此表中删除未使用的行(所有从未被任何其他表引用过的staff) 存在一些约束,如果在其他地方引用行,则无法从staff表中删除行。正因为如此,我希望我可以从STAFF中删除,这将删除未引用的行,并保留其他行 不幸的是,Oracle认为这是一个错误,因此一旦遇到外部引用的行,整个查询就会失败,并违反约束 有什么方法可以让Oracle忽略约束冲突,保持记录不变并继续下一个记录吗?您可以使用PLSQL: BEGIN FOR r IN (SELECT i

我有一个包含许多行的“staff”表,我希望从此表中删除未使用的行(所有从未被任何其他表引用过的staff)

存在一些约束,如果在其他地方引用行,则无法从staff表中删除行。正因为如此,我希望我可以从STAFF中删除
,这将删除未引用的行,并保留其他行

不幸的是,Oracle认为这是一个错误,因此一旦遇到外部引用的行,整个查询就会失败,并违反约束

有什么方法可以让Oracle忽略约束冲突,保持记录不变并继续下一个记录吗?

您可以使用PLSQL:

BEGIN
  FOR r IN (SELECT id FROM STAFF) LOOP
    begin
       delete STAFF where id = r.id;
    exception
       when others then
          null;
    end;
  END LOOP;
END;

但可能需要一些时间才能完成…

您可以使用DML错误日志:

exec dbms_errlog.create_error_log(dml_table_name => 'STAFF'
    ,err_log_table_name => 'STAFF_ERRORS');

delete from STAFF
log errors into STAFF_ERRORS('Is referenced') reject limit 999999999;

然后可以选择删除、截断或删除表STAFF_ERRORS。

相反,我建议您将delete语句的结构设置为只删除您知道没有被其他表引用的STAFF记录。。。如果你发布你的表定义,我们可以帮助你进行查询…@MichaelFredrickson:不幸的是,这是针对一个企业(阅读:庞大、混乱、文档记录糟糕)系统的,部分问题是我不知道哪些表引用了员工。所以这个问题实际上是关于如何避免学习比我真正想要的更多的模式!您可能可以使用ROWID、BULK COLLECT和FORALL来加快速度。您好,我尝试过这种方法,但仍然收到来自oracle的错误消息。有什么建议吗?@Kohakukun检查一下。