我想向可能已有数据的列中添加一个序列,因此我尝试在已有数据之外启动该序列。假设已经有了数据,我想这样做:
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版本。
3条答案
按热度按时间93ze6v8z1#
不能为起始值指定动态值。
但您可以在创建序列后设置该值:
jmp7cifd2#
您可以根据请求恢复您的序列:
适用于Postgres 9.2。
ukdjmx9f3#
只是因为我遇到了与这里公认的答案稍有不同的用例,并且遇到了一个错误,告诉我
setval
不存在,所以我想我会分享一下,以防其他人也有同样的想法。我需要将序列的值设置为
id
列中的最大值,但如果没有行,我还希望将该值与默认的起始值组合在一起。为此,我使用了
coalesce
和max
,如下所示:这里的问题是将
cast
与SELECT一起使用,如果不这样做,您将得到类似于以下内容的错误: