PostgreSQL:在MAX(the_column)+1

时间:2016-05-05 18:23:29

标签: postgresql sequence unique-constraint

我想将一个序列添加到可能已有数据的列中,所以我试图将其启动到已经存在的任何内容之外。假设已有数据,我想这样做:

CREATE SEQUENCE my_sequence MINVALUE 1000000 START
    (SELECT MAX(id_column) FROM my_table) OWNED BY my_table.id_column;

但它一直在(死于声称语法错误。这就像起始值必须是冷硬的数字 - 没有象征意义。

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

我还尝试跳过START然后执行:

ALTER SEQUENCE my_sequence RESTART WITH (SELECT max(id_column)+1 FROM my_table);

但是,再次,它似乎不像符号起始值。

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

2 个答案:

答案 0 :(得分:3)

您无法为起始值指定动态值。

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

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

答案 1 :(得分:1)

您可以通过请求恢复您的序列:

select setval('my_sequence', (SELECT MAX(id_column) FROM my_table));

适用于 Postgres 9.2。