PostgreSQL:从MAX(the_column)+1开始一个序列

Opu*_*pux 3 postgresql sequence unique-constraint

我想向可能已经有数据的列中添加一个序列,所以我试图从已有的序列开始。假设已经有数据,我想这样做:

CREATE SEQUENCE my_sequence MINVALUE 1000000 START
    (SELECT MAX(id_column) FROM my_table) OWNED BY my_table.id_column;
Run Code Online (Sandbox Code Playgroud)

但是它一直渴望(声明语法错误。就像起始值必须是冷硬数字-没什么象征意义。

当然,更好的解决方案是,如果序列具有足够的智能性来避免重复的值,因为id_column它具有唯一的约束,这就是我这样做的原因。但是据我所知,这是不可能的。

我还尝试跳过START,然后执行以下操作:

ALTER SEQUENCE my_sequence RESTART WITH (SELECT max(id_column)+1 FROM my_table);
Run Code Online (Sandbox Code Playgroud)

但是,同样,它似乎不像符号起始值。

我正在运行PostgreSQL 9.4,但是我们的一些客户使用的是像8.3一样原始的东西。

小智 7

您可以根据请求恢复序列:

select setval('my_sequence', (SELECT MAX(id_column) FROM my_table));
Run Code Online (Sandbox Code Playgroud)

适用于 Postgres 9.2。


a_h*_*ame 5

您不能为起始值指定动态值。

但是您可以在创建序列后设置值:

CREATE SEQUENCE my_sequence MINVALUE 1000000 OWNED BY my_table.id_column;
select setval('my_sequence',  (SELECT MAX(id_column) FROM my_table));
Run Code Online (Sandbox Code Playgroud)

  • @Noumenon,这可能与序列的“is_known”列有关。如果为 false,则下次调用 nextval() 将返回序列的当前值。如果“is_used”为“true”,则序列将在返回新值之前递增。调用“setval”时,您可以指定第三个参数来设置“is_known”,但默认为“true”。换句话说,`setval('my_sequence', (SELECT MAX(id_column) FROM my_table));`应该总是导致未来的默认值“从最大的`id_column`之后的1开始”。从 v7.2 开始这似乎是正确的。https://www.postgresql.org/docs/7.2/functions-sequence.html (2认同)