PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Atualizar sequência na linha INSERT


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.