Postgres obsługuje automatyczną inkrementację nieco inaczej niż MySQL. W Postgresie podczas tworzenia serial
pola, tworzysz również pole sekwencji, które śledzi używany identyfikator. To pole sekwencji zaczyna się od wartości 1.
Gdy wstawiasz nowy rekord do tabeli, jeśli nie określisz id
pole, użyje wartości sekwencji, a następnie zwiększy sekwencję. Jeśli jednak określisz id
pole, to sekwencja nie jest używana, a także nie jest aktualizowana.
Zakładam, że po przejściu do Postgresa rozsiałeś lub zaimportowałeś niektórych istniejących użytkowników wraz z ich istniejącymi identyfikatorami. Podczas tworzenia tych rekordów użytkowników z ich identyfikatorami sekwencja nie była używana i dlatego nigdy nie została zaktualizowana.
Jeśli więc np. zaimportowałeś 10 użytkowników, masz użytkowników o id 1-10, ale twoja sekwencja nadal ma wartość 1. Gdy próbujesz utworzyć nowego użytkownika bez podania id, pobiera on wartość z sekwencji ( 1) i otrzymujesz unikalne naruszenie, ponieważ masz już użytkownika o identyfikatorze 1.
Aby rozwiązać ten problem, musisz ustawić swój users_id_seq
wartość sekwencji do MAX(id) istniejących użytkowników. Możesz przeczytać to pytanie/odpowiedź, aby uzyskać więcej informacji na temat resetowania sekwencji, ale możesz też spróbować czegoś takiego (nieprzetestowane):
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;
FYI, nie jest to problem w MySQL, ponieważ MySQL automatycznie aktualizuje sekwencję automatycznego przyrostu do największej wartości w kolumnie, gdy wartość jest ręcznie wstawiana do pola automatycznego przyrostu.