在 Postgresql 中重新启动标识列

jgr*_*cha 3 postgresql sequence identity

对于serialPostgresql < 10 中使用的列,我们按名称管理序列。我们能够通过以下方式重置序列:

SELECT setval('table_id_seq', (SELECT MAX(id) FROM table));
Run Code Online (Sandbox Code Playgroud)

从版本 10 开始,使用标识列,无需使用序列名称。那很好。

ALTER TABLE table ALTER COLUMN id RESTART WITH 1000;
Run Code Online (Sandbox Code Playgroud)

如何在max(id)不知道序列名称的情况下将标识列设置为?

就我从ALTER TABLE 语法中看到的而言,没有办法让子查询来计算序列的开始。

我想写一些类似的东西:

ALTER TABLE table ALTER COLUMN id RESTART WITH (SELECT MAX(id) FROM table);
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 5

您可以对标识列执行相同的操作 - 它们也使用序列。

您可以使用pg_get_serial_sequence()来获取序列的名称:

SELECT setval(pg_get_serial_sequence('the_table', 'id'), coalesce(MAX(id), 1))
from the_table;
Run Code Online (Sandbox Code Playgroud)

以上对serialidentity列的工作方式相同。