【问题标题】:Postgresql: SERIAL incremented on failed constraint INSERTPostgresql:SERIAL 在约束插入失败时增加
【发布时间】:2019-08-08 15:57:10
【问题描述】:

有一个像这样的简单表结构:

CREATE TABLE test (
    id INT PRIMARY KEY,
    sid SERIAL
);

我注意到如果我尝试插入一行但它未能通过约束测试(即 PRIMARY KEY 约束),SERIAL 计数器无论如何都会增加,因此下一个成功插入 sid 将是 sid + 2 而不是sid + 1.

这是正常行为吗?有什么办法可以防止这种情况发生?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    是的,这是设计使然。 Serial 数据类型使用序列,此行为在文档 (Sequence Manipulation Functions) 中有描述:

    为了避免阻塞从 同样的顺序,nextval 操作永远不会回滚;也就是说,一次 已获取的值被视为已使用,即使 执行 nextval 的事务稍后中止。这意味着中止 交易可能会在分配的序列中留下未使用的“漏洞” 价值观。

    没有办法有效地防止它。但是,您可以通过创建单行表并在获取下一个值时锁定它来开发自己的序列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2012-07-18
      • 2016-07-30
      • 2016-06-04
      • 1970-01-01
      • 2015-10-03
      • 2011-10-04
      相关资源
      最近更新 更多