代码之家  ›  专栏  ›  技术社区  ›  hello-klol

PL/SQL:在尝试更新时,删除导致unique_冲突异常的行

  •  0
  • hello-klol  · 技术社区  · 7 年前

    我试图用以下方式更新一个表,并得到一个预期的唯一_冲突异常

    my.db=# UPDATE my_table SET code = REPLACE(code, ‘abd’, ‘abc’);
    ERROR:  duplicate key value violates unique constraint "my_table_pkey"
    DETAIL:  Key (code, group_id)=(abc, 1) already exists.
    

    我知道如果导致此异常,我需要删除不正确的行,而不是更新它,因此我尝试编写以下内容

    DO $$ 
        BEGIN
            UPDATE my_table SET code = REPLACE(code, ‘abd’, ‘abc’);
        EXCEPTION
            WHEN unique_violation THEN
                DELETE FROM my_table WHERE code = ‘abd’ AND group_id = ?;
    END $$;
    

    如何仅删除引发异常的行,并确保更新继续在所有其他条目上运行?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Kaushik Nayak    7 年前

    将其包含在 BEGIN..END 循环的隐式光标内的块。

    DO $$ 
        BEGIN
        for rec IN ( select code, group_id FROM my_table ) 
        LOOP
          BEGIN
            UPDATE my_table SET code = REPLACE(code, 'abd', 'abc') WHERE code=rec.code AND group_id=rec.group_id;
          EXCEPTION
            WHEN unique_violation THEN
                DELETE FROM my_table WHERE code = 'abd' AND group_id = ?;
          END;
        END LOOP;
    END $$;