Estou tentando descobrir como uma inserção de tabela se comporta quando a sequência correspondente transborda no Postgres. Para testar isso, criei uma tabela
CREATE TABLE t1(
id SERIAL
);
Isso criou uma sequência correspondente
select pg_get_serial_sequence('t1', 'id');
pg_get_serial_sequence
------------------------
public.t1_id_seq
(1 row)
Editei a sequência manualmente e defini um valor máximo
alter sequence t1_id_seq MAXVALUE 5;
Neste ponto, eu esperava não poder inserir na tabela quando a sequência atingir seu valor máximo. Mas vi que ainda posso inserir na tabela.
insert into t1 select * from generate_series(10,100);
INSERT 0 91
E a sequência nextval é definida como 1
select * from nextval('t1_id_seq');
nextval
---------
1
(1 row)
A inserção da tabela não deve falhar quando a sequência estourar? Por que a sequência não está transbordando neste caso?
Seu INSERT não está usando a sequência, mas os valores que são retornados por
generate_series()
. Portanto, a sequência nunca é avançada e, portanto, não gera um erro durante a inserção.Se você não fornecer um valor para a
id
coluna ou usardefault
, receberá o erro esperado:O fato de que você pode ignorar a sequência é precisamente o motivo pelo qual o
serial
pseudo-tipo é desencorajadoidentity
em favor das colunas compatíveis com o padrão