【问题标题】:Postgresql wrong auto-increment for serialPostgresql错误的串行自动增量
【发布时间】:2012-09-07 13:00:20
【问题描述】:

我在 postgresql 上有一个问题,我认为 postgresql 中存在错误,我错误地实现了一些东西。

有一个表包括colmn1(primary key),colmn2(unique),colmn3,...

在插入一行之后,如果我尝试使用现有的 colmn2 值进行另一次插入,我会如预期的那样收到重复值错误。但是在这次不成功的尝试之后,colmn1 的下一个值是 尽管没有插入,但增加了 1,所以我得到了带有 id 序列的行,例如,1,2,4,6,9.(3,5,6,7,8 用于不成功的试验)。

我需要能够解释这种奇怪行为的人的帮助。

此信息可能有用:我使用“create unique index on tableName (lower(column1))”查询来设置唯一约束。

【问题讨论】:

    标签: sql postgresql auto-increment


    【解决方案1】:

    PostgreSQL sequence FAQ

    序列旨在生成唯一标识符——不是 必须是严格顺序的标识符。如果两个 并发数据库客户端都尝试从 序列(使用 nextval()),每个客户端将获得不同的序列 价值。如果其中一个客户随后中止他们的交易, 为该客户端生成的序列值将未被使用, 在序列中创建一个间隙。

    在不产生显着性能的情况下无法轻松解决此问题 惩罚。有关详细信息,请参阅 General Bits 时事通讯中 Elein Mustein 的“Gapless Sequences for Primary Keys”。

    【讨论】:

      【解决方案2】:

      来自manual

      重要提示:由于序列是非事务性的,因此由 如果事务回滚,setval 不会被撤消。

      换句话说,有差距是正常的。如果您不想要间隙,请不要使用序列。

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 2016-08-19
        • 2013-03-04
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多