Postgresql 删除行后保持id连续性
删除一行后如何保持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中
例如:一个表中有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一样是主键。