首页 > 解决方案 > 在几行中增加唯一值

问题描述

我将表创建为

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” 详细信息:键 (val)=(7) 已存在。

我怎么能这样做?

标签: sqlpostgresqlsql-updateunique-constraint

解决方案


如果您需要定期使用,您应该将约束创建为可延迟的:

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

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

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

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

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


推荐阅读