Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 删除行后保持id连续性_Postgresql - Fatal编程技术网

Postgresql 删除行后保持id连续性

Postgresql 删除行后保持id连续性,postgresql,Postgresql,删除一行后如何保持id的连续性 例如:一个表中有10行,然后删除最后5行,因此下一个创建将是id 11,但6、7、8、9和10都消失了!。因此,为了保持连续性,我希望新创建的值仅为6。您可以通过自联接实现这一点: SELECT COALESCE(MIN(t1.id + 1), 1) AS id FROM tab t1 LEFT JOIN tab t2 ON t1.id + 1 = t2.id WHERE t2.id IS NULL 此查询搜索表tab中第一个t1.id,其后续项不在tab中

删除一行后如何保持id的连续性


例如:一个表中有10行,然后删除最后5行,因此下一个创建将是id 11,但6、7、8、9和10都消失了!。因此,为了保持连续性,我希望新创建的值仅为6。

您可以通过自联接实现这一点:

SELECT COALESCE(MIN(t1.id + 1), 1) AS id 
FROM tab t1 LEFT JOIN tab t2 ON t1.id + 1 = t2.id
WHERE t2.id IS NULL
此查询搜索表
tab
中第一个
t1.id
,其后续项不在
tab

例如:

SELECT id FROM tab ORDER BY id;
 id
____

SELECT COALESCE(MIN(t1.id + 1), 1) AS id 
FROM tab t1 LEFT JOIN tab t2 ON t1.id + 1 = t2.id
WHERE t2.id IS NULL;
 id 
____
  1

INSERT INTO tab VALUES (1), (2), (3), (4), (6), (7);

SELECT id FROM tab ORDER BY id;
 id
____
  1
  2
  3
  4
  6
  7

SELECT COALESCE(MIN(t1.id + 1), 1) AS id 
FROM tab t1 LEFT JOIN tab t2 ON t1.id + 1 = t2.id
WHERE t2.id IS NULL;
 id 
____
  5

INSERT INTO tab VALUES (5)

SELECT COALESCE(MIN(t1.id + 1), 1) AS id 
FROM tab t1 LEFT JOIN tab t2 ON t1.id + 1 = t2.id
WHERE t2.id IS NULL;
 id 
____
  8

但是请注意,对于并行调用,这种获取主键的方法可能会有问题。如果有多个并行线程以这种方式生成主键,则很容易发生冲突。id列应始终具有主键约束,必要时应使用适当的锁或序列化事务来保护访问。

有多种方法可以重置序列,但这是一个奇怪的要求。你为什么需要这种行为?对不起,我解释得很糟糕。我更新了我的问题。通常情况下,如果你有一个自动增量id,那么最好不要删除一条记录,相反,你有一个额外的列,名为
is\u deleted
。不要这样做。生成的PK值中的间隙完全无关。主键生成值的唯一作业是唯一的
6与42、-645或741一样是主键。