小编ora*_*nge的帖子

更新期间意外违反唯一约束

foo在具有两列(id和)的表中seq,我想为seq具有任意 . 的所有记录添加+1 seq > 4738。计划是在seq=4739所有seq > 4738记录移动+1 后立即插入一条新记录。

这是桌子。

CREATE TABLE foo
(
  id uuid NOT NULL,
  seq integer NOT NULL,
  CONSTRAINT seq_key UNIQUE (seq)
)

CREATE UNIQUE INDEX idx_id
  ON foo
  USING btree
  (id);

CREATE UNIQUE INDEX idx_seq
  ON foo
  USING btree
  (seq);
Run Code Online (Sandbox Code Playgroud)

我尝试通过以下查询实现 +1 转变。请注意,我使用子查询尝试> 4738按降序更新记录(即假设 max seq=10000,则首先更新最后一条记录(10000->10001),然后更新倒数第二条记录(seq=10000此时不存在,seq=9999-> seq=10000(没有违反约束),然后是 9998 -> 9999,...以避免在任何时候发生唯一的约束违反。但是,这假设更新查询是顺序执行的,而这似乎并不是发生的情况。

跑步时

UPDATE foo SET seq=anon_1.new_seq FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql subquery update unique-constraint

4
推荐指数
1
解决办法
4861
查看次数

标签 统计

postgresql ×1

subquery ×1

unique-constraint ×1

update ×1