【问题标题】:PL/SQL: on update attempt, delete row which causes unique_violation exceptionPL/SQL:在更新尝试时,删除导致 unique_violation 异常的行
【发布时间】:2017-11-30 16:57:06
【问题描述】:

我正在尝试通过以下方式更新表,并获得了预期的 unique_violation 异常

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 $$;

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

【问题讨论】:

    标签: sql postgresql exception sql-delete


    【解决方案1】:

    将其包含在隐式游标 for 循环内的 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 $$;
    

    【讨论】:

    • 这太好了,谢谢!所以在删除语句中我现在可以使用group_id = rec.group_id。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2023-03-22
    • 2012-09-13
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多