Postgresql

序列不溢出

  • December 20, 2021

我試圖弄清楚當相應序列在 Postgres 中溢出時表插入的行為。為了測試這一點,我創建了一個表

CREATE TABLE t1(
   id SERIAL
);

這創建了一個相應的序列

select pg_get_serial_sequence('t1', 'id');
pg_get_serial_sequence
------------------------
public.t1_id_seq
(1 row)

我手動編輯了序列並設置了一個最大值

alter sequence t1_id_seq MAXVALUE 5;

在這一點上,我預計一旦序列達到最大值,我將無法插入到表中。但我看到我仍然可以插入到表格中。

insert into t1 select * from generate_series(10,100);
INSERT 0 91

並且序列 nextval 設置為 1

select * from nextval('t1_id_seq');
nextval
---------
      1
(1 row)

當序列溢出時,表插入不應該失敗嗎?為什麼在這種情況下序列沒有溢出?

您的 INSERT 沒有使用序列,而是使用generate_series(). 所以序列永遠不會被推進,因此它不會在插入過程中引發錯誤。

如果您沒有為該id列提供值或使用default,那麼您會得到預期的錯誤:

CREATE TABLE t1(
   id SERIAL
);

alter sequence t1_id_seq MAXVALUE 5;

-- this advances the sequence by 5 values
insert into t1
values (default),(default),(default),(default),(default);

-- this will fail
insert into t1
values (default);

您可以繞過序列的事實正是不鼓勵serial使用偽類型以支持標準兼容列的原因identity

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