Postgres函数遇到独特的约束违规

时间:2019-05-22 12:07:56

标签: sql postgresql plpgsql

我有一个plpgsql函数,其中包含

update allplaces set visittime = now() where visittime is null and person = 'me' and place = 'this';
if (FOUND) then
    update allplaces set visittime = null where person = 'me' and place != 'this';
    return true;
else
    return false;
end if;

allplaces表的唯一约束为create unique index indexallplaces on allplaces (person) where visittime is not null,这意味着给定的person只能有1条记录,其中visittime不能为空。

我正在尝试将visittime从之前的所有记录(person等于'me')(place等于任何值)切换到{ {1}}等于place,但是我提到的唯一索引遇到了唯一约束冲突。我不能在不更改以确保已设置新值的情况下将旧值设置为null,因此需要进行'this'检查。

如何更改此postgres函数以使其正常工作?该函数正在使用if (FOUND),但如果在这种情况下效果更好,它也可以是普通的SQL。

编辑

plpgsql

2 个答案:

答案 0 :(得分:0)

检查(person, place) = ('me', 'this')子句中是否存在带有where的行:

update allplaces
set visittime = null
where visittime is not null and person = 'me'
and exists (
    select from allplaces
    where person = 'me'
    and place = 'this');

update allplaces 
set visittime = now()
where person = 'me' and place = 'this';

答案 1 :(得分:0)

仅将查询更改为使用这样的情况如何

update allplaces 
set visittime = case when place <> 'this' then null else now() end  
where person = 'me';

这将用null更新所有访问时间,但place = this除外。 鉴于在更新时只有1行(me,this),这应该可以工作