加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Postgresql:SERIAL在失败的约束INSERT上递增

发布时间:2020-12-13 18:05:44 所属栏目:百科 来源:网络整理
导读:有一个像这样的简单表结构: CREATE TABLE test ( id INT PRIMARY KEY,sid SERIAL); 我注意到如果我尝试插入行但是它没有通过约束测试(即PRIMARY KEY约束),则SERIAL计数器将无论如何都会递增,因此下一个成功插入sid将是sid 2而不是sid 1. 这是正常的行为吗?
有一个像这样的简单表结构:
CREATE TABLE test (
    id INT PRIMARY KEY,sid SERIAL
);

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

这是正常的行为吗?有什么办法可以防止这个?

是的,这是设计的.串行数据类型使用序列,文档( Sequence Manipulation Functions)中描述了此行为:

To avoid blocking concurrent transactions that obtain numbers from the
same sequence,a nextval operation is never rolled back; that is,once
a value has been fetched it is considered used,even if the
transaction that did the nextval later aborts. This means that aborted
transactions might leave unused “holes” in the sequence of assigned
values.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读