我试图弄清楚当相应的序列在 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
,那么您会得到预期的错误:您可以绕过序列的事实正是不鼓励
serial
使用伪类型以支持标准兼容列的原因identity