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)