PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL:Unikalne naruszenie:7 BŁĄD:zduplikowana wartość klucza narusza unikatowe ograniczenie users_pkey

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL 13:Nie pozwól, aby sloty zabiły twój podstawowy

  2. Wartość referencyjna kolumny serii w innej kolumnie podczas tej samej INSERT

  3. Użytkownicy aplikacji a zabezpieczenia na poziomie wiersza

  4. Sprawdź cele statystyk w PostgreSQL

  5. Dołącz do czterech stołów z udziałem LEFT JOIN bez duplikatów