SQL删除查询时忽略错误并继续

时间:2018-08-27 15:41:32

标签: sql postgresql foreign-keys sql-delete

这样做:

delete from product 
where descricao ilike '%ACC%'

我收到此错误:

  

对表“ product”的更新或删除违反了表“ productmoviment”上的外键约束“ fk3b140f7bc8c91aae”

我需要查询continue并执行所有行,删除不存在的行,因为如果单个行具有外键,则根本不执行其他任何行

谢谢

2 个答案:

答案 0 :(得分:0)

要删除此内容,您必须使用ON DELETE CASCADE.

定义外键约束

CASCADE定义为删除引用行时,它也会自动删除引用行

阅读documentation

但是还有另一种方法 您必须先删除一个外键,然后再删除父表

 delete from childtable
 where id_parent = 1;-- child table

 DELETE FROM parent
  WHERE id_parent = 1; --parent table

答案 1 :(得分:0)

我认为这类似于一次性清理操作:否则,您必须确保正确定义了外键。

您可以使用匿名存储过程来做到这一点。

假设:

  • 产品表具有一个名为id的主键
DO $$
DECLARE
    pr product%rowtype;
BEGIN
      FOR pr IN 
      select * from product
      where descricao ilike '%ACC%'
      LOOP
        RAISE NOTICE 'trying to delete product id  %',pr.id;
          BEGIN
              DELETE FROM product WHERE id=pr.id;
              RAISE NOTICE 
              'Deleted product id: %',pr.id;
          EXCEPTION
              WHEN others THEN 
                  -- we ignore the error
              END;
      END LOOP;
END $$;

基本上,对与WHERE子句匹配的所有产品(描述为'%ACC%')进行迭代,并尝试一次删除它们,而忽略由于外键而无法删除的产品的错误。