增加几行中的唯一值[重复]

问题描述 投票:3回答:3

这个问题在这里已有答案:

我把表创建为

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)已存在。

我怎么能这样做?

sql postgresql sql-update unique-constraint
3个回答
3
投票

如果您需要定期,则应将约束创建为可延迟:

create table test
(
    val int not null
);
alter table test
   add constraint unique_value unique(val)
   deferrable initially immediate;

为了使预期的更新起作用,没有必要将约束标记为initially deferredchange the constraints在会话中可延迟。

使用上述约束,以下更新工作正常:

update test set val=val+1 where val > 5;

在线示例:http://rextester.com/KXI21597


2
投票

没有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


1
投票

一种选择是删除唯一约束,然后将其添加回来。

另一种选择是黑客攻击:

update public.test
    set val = - val
    where val > 5;

update public.test
    set val = (- val) + 1
    where val < 0;
© www.soinside.com 2019 - 2024. All rights reserved.