PostgreSQL:从Max(The_Column)+1开始序列

6rqinv9w  于 2022-10-15  发布在  PostgreSQL
关注(0)|答案(3)|浏览(166)

我想向可能已有数据的列中添加一个序列,因此我尝试在已有数据之外启动该序列。假设已经有了数据,我想这样做:

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);

但是,再说一次,这似乎不像是象征性的起始值。
我运行的是PostgreSQL9.4,但我们的一些客户使用的是最原始的8.3版本。

93ze6v8z

93ze6v8z1#

不能为起始值指定动态值。
但您可以在创建序列后设置该值:

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

jmp7cifd2#

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

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

适用于Postgres 9.2。

ukdjmx9f

ukdjmx9f3#

只是因为我遇到了与这里公认的答案稍有不同的用例,并且遇到了一个错误,告诉我setval不存在,所以我想我会分享一下,以防其他人也有同样的想法。
我需要将序列的值设置为id列中的最大值,但如果没有行,我还希望将该值与默认的起始值组合在一起。
为此,我使用了coalescemax,如下所示:

select setval('sequence', cast((select coalesce(max(id),1) from table) as bigint));

这里的问题是将cast与SELECT一起使用,如果不这样做,您将得到类似于以下内容的错误:

ERROR:  function setval(unknown, double precision) does not exist
LINE 1: select setval('sequence', (select coalesce(MAX(i...

HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

相关问题