当 PostgreSQL 中的 INSERT 语句失败时防止主键增量

mis*_*iso 5 postgresql primary-key auto-increment

我的 PostgreSQL 数据库中有一个简单的表,如下所示:

CREATE TABLE person_type
(
  id serial NOT NULL,
  name character(55) NOT NULL,
  CONSTRAINT person_type_pkey PRIMARY KEY (id),
  CONSTRAINT person_type_name_key UNIQUE (name)
)
Run Code Online (Sandbox Code Playgroud)

如您所见,id会自动递增,并且名称必须是唯一的。每次我运行 INSERT sql 语句时,即使它失败,id 也会增加 1。

我怎样才能防止这种情况?为了每次成功插入一行,主键是相关的

小智 6

这正是您所面临的:

test=# CREATE SEQUENCE seq_a;
CREATE SEQUENCE
test=# SELECT nextval('seq_a');
 nextval 
---------
       1
(1 row)

test=# BEGIN;
BEGIN
test=# SELECT nextval('seq_a');
 nextval 
---------
       2
(1 row)

test=# ROLLBACK;
ROLLBACK
test=# SELECT nextval('seq_a');
 nextval 
---------
       3
(1 row)
Run Code Online (Sandbox Code Playgroud)

序列确保值是升序的,但不能确保它不包含间隙。同样重要的是要注意序列不能回滚。您不能同时拥有严格的上升和无间隙交易,因为它不适用于多头和空头交易的混合。因此序列不应该用于发票 ID 等。