Essa é uma limitação conhecida:as sequências são incrementadas durante a chamada do
nextval()
function, que é o valor padrão do seu campo. Quando você fornece dados em INSERT
para esse campo, a expressão do valor padrão não é avaliada, por isso o valor da sequência não é tocado. Uma solução alternativa é configurar um gatilho antes/depois de
INSERT
para corrigir manualmente o valor da sequência com setval()
. Mas desta forma você deveria precisa configurar um gatilho em UPDATE
nesse campo também, para corrigir o valor da sequência, quando você apenas atualiza algum id existente para um id mais alto. Outra solução é escrever uma função armazenada, que pode produzir um valor disponível para esse campo e definir o valor padrão do seu campo para o valor de retorno dessa função. Alguma coisa, como:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Mas esteja avisado:a funcionalidade padrão para sequências é segura para inserções simultâneas (o estado atual da sequência é global - independente de transação). Se você fornecer valores explícitos para esses campos, esse não será o caso.