当我从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
有没有人有明确的解决方案?
答案 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下一个价值检索)。