这个问题在这里已有答案:
我把表创建为
create table public.test
(
val int unique not null
)
该表包含一些行
| Val |
|--------|
|1 |
|2 |
|3 |
|4 |
|5 |
|6 |
|7 |
|8 |
|9 |
我想增加大于5的所有值(使用PostgreSQL)。但如果尝试update public.test set val=val+1 where val > 5
我会得到例外:
错误:重复键值违反唯一约束“test_val_key”DETAIL:键(val)=(7)已存在。
我怎么能这样做?
如果您需要定期,则应将约束创建为可延迟:
create table test
(
val int not null
);
alter table test
add constraint unique_value unique(val)
deferrable initially immediate;
为了使预期的更新起作用,没有必要将约束标记为initially deferred
或change the constraints在会话中可延迟。
使用上述约束,以下更新工作正常:
update test set val=val+1 where val > 5;
没有deferrable initially immediate
的选项
update test t1
set val=t2.val+1
from (select val from test order by val desc) t2
where t2.val > 5 and t1.val=t2.val
在线示例:http://rextester.com/HVZRC8695
检查排序已保存的在线示例:http://rextester.com/FAU54991
一种选择是删除唯一约束,然后将其添加回来。
另一种选择是黑客攻击:
update public.test
set val = - val
where val > 5;
update public.test
set val = (- val) + 1
where val < 0;