Postgresql

當 PostgreSQL 中的 INSERT 語句失敗時防止主鍵增加

  • October 29, 2018

我的 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)
)

如您所見,id會自動遞增,並且名稱必須是唯一的。每次我執行 INSERT sql 語句時,即使它失敗,id 也會加一。

我怎樣才能防止這種情況?為了每次插入一行成功,主鍵是相關的

這正是您所面臨的:

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)

一個序列確保值是遞增的,但它不能確保它不包含間隙。同樣重要的是要注意不能回滾序列。您不能同時擁有嚴格的上升和無缺口,因為它不適用於多頭和空頭交易的混合。因此,序列永遠不應該用於發票 ID 等。

引用自:https://dba.stackexchange.com/questions/83350