我有一个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
答案 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),这应该可以工作