PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL:Vi phạm duy nhất:7 LỖI:giá trị khóa trùng lặp vi phạm ràng buộc duy nhất users_pkey

Postgres xử lý tự động tăng dần một chút khác với MySQL. Trong Postgres, khi bạn tạo serial , bạn cũng đang tạo một trường trình tự theo dõi id để sử dụng. Trường trình tự này sẽ bắt đầu với giá trị là 1.

Khi bạn chèn một bản ghi mới vào bảng, nếu bạn không chỉ định id , nó sẽ sử dụng giá trị của trình tự, và sau đó tăng dần trình tự. Tuy nhiên, nếu bạn chỉ định id thì trình tự không được sử dụng và cũng không được cập nhật.

Tôi giả định rằng khi bạn chuyển sang Postgres, bạn đã seed hoặc nhập một số người dùng hiện có, cùng với id hiện có của họ. Khi bạn tạo các bản ghi người dùng này bằng id của họ, trình tự không được sử dụng và do đó nó không bao giờ được cập nhật.

Vì vậy, ví dụ:nếu bạn đã nhập 10 người dùng, bạn có người dùng có id từ 1-10, nhưng chuỗi của bạn vẫn ở mức 1. Khi bạn cố gắng tạo người dùng mới mà không chỉ định id, nó sẽ lấy giá trị từ chuỗi ( 1), và bạn nhận được một vi phạm duy nhất vì bạn đã có một người dùng với id 1.

Để giải quyết vấn đề, bạn cần đặt users_id_seq của mình giá trị trình tự thành MAX (id) của người dùng hiện tại của bạn. Bạn có thể đọc câu hỏi / câu trả lời này để biết thêm thông tin về cách đặt lại trình tự, nhưng bạn cũng có thể thử một cái gì đó như (chưa được kiểm tra):

SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;

FYI, đây không phải là vấn đề trong MySQL vì MySQL tự động cập nhật chuỗi tăng tự động thành giá trị cột lớn nhất khi một giá trị được chèn theo cách thủ công vào trường tự động tăng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt giá trị trong phần phụ thuộc của biểu đồ Helm

  2. PostgreSQL 9.6:Quét tuần tự song song

  3. Postgres:xác định giá trị mặc định cho lỗi CAST?

  4. Fluent NHibernate và PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:Không hỗ trợ phương pháp đã chỉ định

  5. Mảng PostgreSQL của các phần tử mà mỗi phần tử là một khóa ngoại