关于冲突的更新不做任何事情

时间:2016-07-24 05:41:02

标签: postgresql

我正在尝试更新表格,以便我可以从其中一列删除前置零。我想做这样的事情:

UPDATE oh_person SET identifier = TRIM(LEADING '0' FROM identifier)

问题是某些行已经具有没有前置零的标识符,并且由于此列应该是唯一的,因此它会在这些实例中引发错误。可以这样做吗?

UPDATE oh_person SET identifier = TRIM(LEADING '0' FROM identifier) ON CONFLICT (identifier) DO NOTHING

我知道那个特定的查询是不可能的,但是还有其他语法可以实现吗?

1 个答案:

答案 0 :(得分:4)

示例数据:

create table oh_person(identifier text unique);
insert into oh_person 
values ('012'), ('0012'), ('0015'), ('015');

使用anonymous code block

do $$
declare
    r record;
begin
    for r in
        select identifier
        from oh_person
        where left(identifier, 1) = '0'
    loop
    begin
        update oh_person
        set identifier = trim(leading '0' from identifier)
        where identifier = r.identifier;
    exception
        when unique_violation then
            raise notice '% not updated', r.identifier;
    end;
    end loop;
end $$;

NOTICE:  0012 not updated
NOTICE:  015 not updated

结果:

select * from oh_person;

 identifier 
------------
 0012
 015
 12
 15
(4 rows)
相关问题