No meu banco de dados postgresql 9.2 criei a seguinte tabela:
CREATE TABLE dummy(id SERIAL PRIMARY KEY,text TEXT);
E eu inseri um registro via:
INSERT INTO dummy(text) VALUES ("Hello Word");
Então eu inseri um registro assim:
INSERT INTO dummy(id,text) VALUES (2,'SAYONARA Word');
Depois, quando tentei inserir um registro assim:
INSERT INTO dummy(text) VALUES ('<3 Word');
Estou tendo o erro a seguir:
ERRO: o valor de chave duplicado viola a restrição exclusiva "dummy_pkey" DETALHE: A chave (id)=(2) já existe.
Mas quando eu reinsiro o valor:
INSERT INTO dummy(text) VALUES ('<3 Word');
Nenhum erro é lançado.
Então, como vejo, o potgresql incrementa automaticamente um valor para id por meio de um contador interno, independentemente de o valor ser inserido com sucesso ou não. Além disso, o erro ocorreu porque o postgresql não "perfura" o ID do contador existente.
Então, como posso dizer ao postgresql se o valor de autoincrement existe apenas para pular para o próximo e evitar usar o valor de autoincrement existente. (Por existente quero dizer valores que já foram definidos como chave primária).
Você pode usar a seguinte instrução para sincronizar a sequência com o valor máximo atual da coluna ID:
Exemplo online: https://rextester.com/GMK2630
Você pode executar isso manualmente depois de inserir linhas com valores fornecidos explicitamente.
Observe que isso ainda pode resultar em um valor de sequência errado se isso for feito simultaneamente de várias transações porque uma transação não vê os valores inseridos (mas não confirmados) por outras transações.
Mas eu recomendo fortemente simplesmente deixar o padrão fazer seu trabalho, ajustar a sequência assim é mais um hack, em vez de uma boa prática de codificação.