PostgreSQL:从 MAX(the_column)+1 处开始一个序列
PostgreSQL: starting a sequence at MAX(the_column)+1
我想向可能已经有数据的列添加一个序列,所以我试图在已有数据之外开始它。假设已经有数据,我想这样做:
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 这样原始的东西。
您不能为起始值指定动态值。
但是您可以在创建序列后设置该值:
CREATE SEQUENCE my_sequence MINVALUE 1000000 OWNED BY my_table.id_column;
select setval('my_sequence', (SELECT MAX(id_column) FROM my_table));
您可以按要求恢复序列:
select setval('my_sequence', (SELECT MAX(id_column) FROM my_table));
适用于 Postgres 9.2。
我想向可能已经有数据的列添加一个序列,所以我试图在已有数据之外开始它。假设已经有数据,我想这样做:
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 这样原始的东西。
您不能为起始值指定动态值。
但是您可以在创建序列后设置该值:
CREATE SEQUENCE my_sequence MINVALUE 1000000 OWNED BY my_table.id_column;
select setval('my_sequence', (SELECT MAX(id_column) FROM my_table));
您可以按要求恢复序列:
select setval('my_sequence', (SELECT MAX(id_column) FROM my_table));
适用于 Postgres 9.2。