【问题标题】:Oracle - ignoring constraint failuresOracle - 忽略约束失败
【发布时间】:2012-01-15 14:08:33
【问题描述】:

我有一个包含许多行的“员工”表,我想从该表中删除未使用的行(所有其他表从未引用过的所有员工。)

存在一些限制,因此如果在其他地方引用它们,则无法从员工表中删除行。因此,我希望我可以只使用 DELETE FROM STAFF 来删除未引用的行并留下其他行。

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

有什么方法可以告诉 Oracle 忽略约束违规,保持记录不变并继续下一个记录?

【问题讨论】:

  • 相反,我建议您将删除语句构造为仅删除您知道未被其他表引用的 STAFF 记录...如果您发布表定义,我们可以帮助您进行该查询...
  • @MichaelFredrickson:不幸的是,这是针对企业(阅读:庞大、凌乱且记录不充分)系统的,部分问题是我不知道哪些表引用了员工。所以这个问题实际上是关于我如何避免学习比我真正想要的更多的模式!

标签: sql oracle


【解决方案1】:

您可以使用 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。

【讨论】:

  • 您好,我尝试了这种方法,但我仍然收到来自 oracle 的错误。有什么建议吗?
  • @Kohakukun 检查这些restrictions
【解决方案2】:

你可以使用 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;

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

【讨论】:

  • 您可以使用 ROWID、BULK COLLECT 和 FORALL 加速此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2010-10-17
相关资源
最近更新 更多