2016-06-22 37 views
5

Tôi đang sử dụng psql trong Ứng dụng Laravel của mình. Tôi đang cố gắng để tạo ra người dùng của tôi, và tôi tiếp tục nhận được lỗi nàyVi phạm duy nhất: 7 LRI: giá trị khóa trùng lặp vi phạm ràng buộc duy nhất "users_pkey"

Unique violation: 7 ERROR: duplicate key value violates unique constraint "users_pkey"


Dưới đây là những gì tôi đã làm để lưu trữ người dùng của tôi

$user = User::where('account_id','=',$id)->first(); 
$user->email = $account->email_address; 
$user->fb_email = ''; 
$user->tw_email = ''; 
$user->fb_access_token = ''; 
$user->fb_profile_id = ''; 
$user->fb_page_id = ''; 
$user->fb_username = ''; 
$user->save(); 

Dưới đây là cách tôi tạo của tôi người dùng bảng

CREATE TABLE "users" (
    "id" serial NOT NULL , 
    "account_id" varchar(255) NOT NULL , 
    "email" varchar(255) NOT NULL , 
    "fb_email" varchar(255) NOT NULL , 
    "tw_email" varchar(255) NOT NULL , 
    "created_at" timestamp(0) without time zone, 
    "updated_at" timestamp(0) without time zone, 
    "fb_access_token" varchar(255) NOT NULL , 
    "fb_profile_id" varchar(255) NOT NULL , 
    "fb_page_id" varchar(255) NOT NULL , 
    "fb_username" varchar(255) NOT NULL , 
    PRIMARY KEY ("id") 

); 

Tôi có làm bất cứ điều gì mà tôi là not giả sử?

Điều tôi hiện đang sử dụng để hoạt động khi tôi treo ứng dụng của mình với MySQL.

Mọi gợi ý/đề xuất sẽ có ý nghĩa đối với tôi.


Ảnh chụp màn hình

enter image description here

+0

bạn không có user_pkey trong chèn của mình và nhiều khả năng không làm cho nó trở thành giá trị gia tăng tự động trong DB, do đó, nó nhận giá trị mặc định, xảy ra ở những nơi khác trong bảng, khiến lỗi. –

+0

Nó phải là sự khác biệt giữa psql so với mysql một lần nữa. – ihue

+0

Làm cách nào để tạo/sử dụng 'id' làm khóa của tôi? là nó có thể? – ihue

Trả lời

12

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

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

Tôi giả sử rằng khi bạn chuyển sang Postgres, bạn đã nhập hoặc nhập một số người dùng hiện tại cùng với các id hiện có của họ. Khi bạn tạo các bản ghi người dùng này với các id của họ, chuỗi không được sử dụng và do đó nó không bao giờ được cập nhật. Vì vậy, nếu, ví dụ, bạn đã nhập 10 người dùng, bạn có người dùng có id 1-10, nhưng chuỗi của bạn vẫn ở 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ừ trình tự (1) và bạn nhận được vi phạm duy nhất vì bạn đã có người dùng có id 1.

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

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

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

+0

Bạn chính xác 100%, sau khi tôi cung cấp id theo cách thủ công, giờ nó hoạt động 'hoàn toàn '. – ihue

Các vấn đề liên quan