Postgres maneja el incremento automático de manera un poco diferente a como lo hace MySQL. En Postgres, cuando crea el serial
campo, también está creando un campo de secuencia que realiza un seguimiento de la identificación a usar. Este campo de secuencia comenzará con un valor de 1.
Cuando inserta un nuevo registro en la tabla, si no especifica el id
campo, utilizará el valor de la secuencia y luego incrementará la secuencia. Sin embargo, si especifica el id
entonces la secuencia no se usa y tampoco se actualiza.
Supongo que cuando se mudó a Postgres, sembró o importó algunos usuarios existentes, junto con sus identificaciones existentes. Cuando creó estos registros de usuario con sus ID, la secuencia no se usó y, por lo tanto, nunca se actualizó.
Entonces, si, por ejemplo, importó 10 usuarios, tiene usuarios con ID 1-10, pero su secuencia aún está en 1. Cuando intenta crear un nuevo usuario sin especificar la ID, extrae el valor de la secuencia ( 1), y obtiene una infracción única porque ya tiene un usuario con id 1.
Para resolver el problema, debe configurar su users_id_seq
valor de secuencia al MAX(id) de sus usuarios existentes. Puede leer esta pregunta/respuesta para obtener más información sobre cómo restablecer la secuencia, pero también puede probar algo como (no probado):
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;
FYI, esto no es un problema en MySQL porque MySQL actualiza automáticamente la secuencia de incremento automático al valor de columna más grande cuando un valor se inserta manualmente en el campo de incremento automático.