Postgresql
序列不溢出
我試圖弄清楚當相應序列在 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