删除表中的所有行后,如何将序列类型重置回 0?

use*_*636 4 postgresql postgresql-10

我之前问过这个问题,有人在 db fiddle 上发布了一个非常有用的答案。这对我来说非常有效。但是,现在我想问一个新的(相关)问题:

假设我清除了表中的所有行(即在数据库小提琴示例中,通过执行“从 id > 0 的水果中删除”来删除苹果和橙色行)。如果我插入另一种水果(如西瓜),id 将从 4 开始,而不是 1。如何强制 id 类型重置回 0,以便下一次插入的 id=1 ?

Erw*_*ter 6

简单(假设您知道序列名称):

SELECT setval('fruits_id_seq', 1, false);
Run Code Online (Sandbox Code Playgroud)

或者:

ALTER SEQUENCE payments_id_seq RESTART WITH 0;
Run Code Online (Sandbox Code Playgroud)

安全(您不知道序列名称或不确定表是否为空):

SELECT setval(pg_get_serial_sequence('fruits', 'id')
            , COALESCE(max(id) + 1, 1)
            , false)
FROM   fruits;
Run Code Online (Sandbox Code Playgroud)

db<>在这里摆弄

当然,在并发写入负载下这仍然不安全 - 您根本不应该打乱这样的顺序。

看: