Postgresql
當 PostgreSQL 中的 INSERT 語句失敗時防止主鍵增加
我的 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 等。