【问题标题】:SQL delete query ignoring errors and continueSQL删除查询忽略错误并继续
【发布时间】:2018-08-27 15:41:31
【问题描述】:

这样做:

delete from product 
where descricao ilike '%ACC%'

我得到这个错误:

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

我需要查询 continue 并执行所有行,删除没有的行,因为如果一行有外键,它根本不会执行任何其他行

谢谢

【问题讨论】:

  • 请为您正在使用的数据库添加标签 - 这很可能取决于所使用的数据库。
  • 另外,预期的结果是什么,即其他表引用的那些行应该发生什么?最好将引用定义为 ON DELETE CASCADE|SET NULL 或在您的 where 中包含一个条件,以检查引用表中没有对记录的引用。

标签: sql postgresql foreign-keys sql-delete


【解决方案1】:

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

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

假设:

  • 产品表有一个名为 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 子句匹配的所有产品(descricao ilike '%ACC%')并尝试将它们一一删除,忽略由于外键而无法删除的产品的错误。

【讨论】:

    【解决方案2】:

    要删除这个,你必须用ON DELETE CASCADE.定义外键约束

    CASCADE 定义当引用的行被删除时,它也会自动删除引用的行

    阅读documentation

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

     delete from childtable
     where id_parent = 1;-- child table
    
     DELETE FROM parent
      WHERE id_parent = 1; --parent table
    

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2012-03-12
      • 2011-05-07
      相关资源
      最近更新 更多