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.