PostgreSQL序列

6
当我从Postgresql表中删除所有记录,然后尝试将序列重置为插入新记录时的编号1时,结果会有所不同:
SELECT setval('tblname_id_seq', (SELECT COALESCE(MAX(id),1) FROM tblname));

这将当前序列的值设置为1,但是下一个记录(因为还没有任何记录,所以实际上是第一个记录)将获得数字2!

我不能将它设置为0,因为序列中的最小值是1!

当我使用:

ALTER SEQUENCE tblname_id_seq RESTART WITH 1;

实际上插入的第一条记录获得编号1!但是上述代码不接受SELECT作为值,而不是1。

当没有记录时,我希望将序列重置为1号,第一条记录应该从1开始。但是当表中已经有记录时,我想重置序列,以便插入的下一条记录将获得{ highest } + 1。

有人有清晰的解决方案吗?

2个回答

11
使用 setval 的三个参数形式将 is_called 标志设置为false,以便它返回序列的当前值供下一个 nextval 调用,而不是立即生成新值。
另外请注意,您需要使用 COALESCE(MAX(id),0)+1 ,否则序列的第一个值将为 MAX(id),这个值已经存在。(感谢Stephen Denne) http://www.postgresql.org/docs/current/interactive/functions-sequence.html

2
请使用 COALESCE(MAX(id),0)+1 - Stephen Denne
是的,否则下一个id将与MAX(id)发生冲突。 - araqnid
太好了,现在它可以工作了,谢谢。我确实研究了那个参数,但是当我尝试时它没有起作用。我一定做错了什么... - Dylan

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接