SQL表:
id | name
----+--------
1 | apple
2 | orange
3 | apricot
id
是主键,唯一,可以为SERIES
。目标是插入id
等于2的新行,并将下面的现有行号(即2和3)移到3和4的位置。
在插入新行之前,我尝试过移位行:
"UPDATE some_table SET id = id + 1 WHERE id >= id"
但发生错误:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "some_table_pkey"
Detail: Key (id)=(3) already exists.
有什么有效的方法可以进行这种手术吗?
更新后,该表应如下所示:
id | name
----+--------
1 | apple
2 | cherry
3 | orange
4 | apricot
答案 0 :(得分:2)
虽然我认为尝试是徒劳的,但是您可以通过将主键约束标记为可延期来实现:
CREATE TABLE some_table
(
id int,
name text
);
alter table some_table
add constraint pk_some_table
primary key (id)
deferrable initially immediate; --<< HERE
在这种情况下,PK约束是按每个语句而不是每行评估的。
答案 1 :(得分:0)
更新名称 设置id = id + 1 id在哪里 (从ID> = 2按ID desc排序的名称中选择ID);
首先,您可以更新ID,然后可以插入
插入名称(id,name)值(2,'cheery')