【问题标题】:Postgresql sequencesPostgresql 序列
【发布时间】:2011-01-12 02:47:10
【问题描述】:

当我从 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 开始。但是当表中已经有记录时,我想重置序列以便下一条记录插入将获得 {highest}+1

有人对此有明确的解决方案吗?

【问题讨论】:

    标签: postgresql sequence reset


    【解决方案1】:

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

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

    还请注意,您需要使用COALESCE(MAX(id),0)+1,否则序列中的第一个值将是MAX(id),您知道它已经存在。 (谢谢斯蒂芬丹尼)

    【讨论】:

    • 并使用COALESCE(MAX(id),0)+1
    • 是,否则下一个id会和MAX(id)冲突。
    • 现在很好用,thanx....我确实研究了那个参数,但是当我尝试它时它没有用。我一定是做错了什么……
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2012-04-16
      • 2011-03-23
      • 2014-10-22
      相关资源
      最近更新 更多