Postgres menangani penambahan otomatis sedikit berbeda dari MySQL. Di Postgres, saat Anda membuat serial
bidang, Anda juga membuat bidang urutan yang melacak id yang akan digunakan. Bidang urutan ini akan dimulai dengan nilai 1.
Saat Anda memasukkan catatan baru ke dalam tabel, jika Anda tidak menentukan id
bidang, itu akan menggunakan nilai urutan, dan kemudian menambah urutan. Namun, jika Anda menentukan id
bidang, maka urutannya tidak digunakan, dan juga tidak diperbarui.
Saya berasumsi bahwa ketika Anda pindah ke Postgres, Anda menyemai atau mengimpor beberapa pengguna yang ada, bersama dengan id mereka yang ada. Saat Anda membuat catatan pengguna ini dengan id mereka, urutannya tidak digunakan, dan karena itu tidak pernah diperbarui.
Jadi, jika, misalnya, Anda mengimpor 10 pengguna, Anda memiliki pengguna dengan id 1-10, tetapi urutan Anda masih 1. Saat Anda mencoba membuat pengguna baru tanpa menentukan id, itu menarik nilai dari urutan ( 1), dan Anda mendapatkan pelanggaran unik karena Anda sudah memiliki pengguna dengan id 1.
Untuk mengatasi masalah ini, Anda perlu mengatur users_id_seq
nilai urutan ke MAX(id) pengguna Anda yang ada. Anda dapat membaca pertanyaan/jawaban ini untuk informasi lebih lanjut tentang mengatur ulang urutan, tetapi Anda juga dapat mencoba sesuatu seperti (belum diuji):
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;
FYI, ini bukan masalah di MySQL karena MySQL secara otomatis memperbarui urutan kenaikan otomatis ke nilai kolom terbesar ketika nilai secara manual dimasukkan ke dalam bidang kenaikan otomatis.