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

PostgreSQL:violação exclusiva:7 ERRO:valor de chave duplicado viola restrição exclusiva users_pkey


O Postgres lida com o incremento automático de maneira um pouco diferente do MySQL. No Postgres, quando você cria o serial campo, você também está criando um campo de sequência que acompanha o id a ser usado. Este campo de sequência vai começar com um valor de 1.

Ao inserir um novo registro na tabela, se você não especificar o id campo, ele usará o valor da sequência e, em seguida, incrementará a sequência. No entanto, se você especificar o id campo, a sequência não é usada e também não é atualizada.

Estou assumindo que quando você mudou para o Postgres, você semeou ou importou alguns usuários existentes, juntamente com seus ids existentes. Quando você criou esses registros de usuário com seus ids, a sequência não foi usada e, portanto, nunca foi atualizada.

Então, se, por exemplo, você importou 10 usuários, você tem usuários com ids de 1 a 10, mas sua sequência ainda está em 1. Quando você tenta criar um novo usuário sem especificar o id, ele extrai o valor da sequência ( 1) e você obtém uma violação exclusiva porque já possui um usuário com o ID 1.

Para resolver o problema, você precisa definir seu users_id_seq valor de sequência para o MAX(id) de seus usuários existentes. Você pode ler esta pergunta/resposta para obter mais informações sobre como redefinir a sequência, mas também pode tentar algo como (não testado):
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;

Para sua informação, isso não é um problema no MySQL porque o MySQL atualiza automaticamente a sequência de incremento automático para o maior valor da coluna quando um valor é inserido manualmente no campo de incremento automático.