Postgresql序列

时间:2011-01-12 02:47:10

标签: postgresql sequence reset

当我从Postgresql表中删除所有记录然后尝试重置序列以在插入时启动编号为1的新记录时,我会得到不同的结果:

SELECT setval('tblname_id_seq', (SELECT COALESCE(MAX(id),1) FROM tblname));

这会将序列的当前值设置为1,但NEXT记录(实际上是第一个,因为还没有记录)得到数字2!

我无法将其设置为0,因为序列中的最小值为1!

当我使用时:

ALTER SEQUENCE tblname_id_seq RESTART WITH 1;

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

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

有没有人有明确的解决方案?

2 个答案:

答案 0 :(得分:10)

使用setval的三参数形式将is_called标志设置为false,以便它返回下一个nextval调用的序列的当前值,而不是立即生成一个新的。

http://www.postgresql.org/docs/current/interactive/functions-sequence.html

另请注意,您需要使用COALESCE(MAX(id),0)+1,否则序列中的第一个值将为MAX(id),您知道它已经存在。 (thx Stephen Denne)

答案 1 :(得分:2)

请参阅页面底部附近的http://www.postgresql.org/docs/current/static/functions-sequence.html

具体来说,至少在Postgresql 9.0中,您可以找到并设置序列的值。您可以使用setval()的三参数形式来设置序列的当前值或序列的 next 值(这将允许您将序列设置为1下一个价值检索)。