如何在现有位置插入新行之前更新唯一表的行号

时间:2019-07-11 10:09:54

标签: sql postgresql

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

2 个答案:

答案 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约束是按每个语句而不是每行评估的。

在线示例:https://rextester.com/JSIV60771

答案 1 :(得分:0)

更新名称 设置id = id + 1  id在哪里  (从ID> = 2按ID desc排序的名称中选择ID);

首先,您可以更新ID,然后可以插入

插入名称(id,name)值(2,'cheery')