微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

一个像这样的简单表结构:
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.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐