2016-06-22 192 views
5

我在我的Laravel應用程序中使用psql。 我試圖創建我的用戶,我不斷收到此錯誤唯一違規:7錯誤:重複鍵值違反唯一約束「users_pkey」

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


這裏我做了什麼來存儲我的用戶

$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(); 

這裏是我創造了我用戶表

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") 

); 

我做了嗎任何我想not假設?

當我用MySQL掛鉤我的應用程序時,我現在有用的工作。

任何提示/建議對我來說意義重大。


截圖

enter image description here

+0

您的插入中沒有users_pkey,並且很可能沒有使其成爲數據庫中的自動遞增值,因此它會得到一個默認值,這恰好已經存在於表中的其他位置,導致您的錯誤。 –

+0

它必須是psql與mysql之間的差異。 – ihue

+0

如何將我的id作爲我的pkey?可能嗎 ? – ihue

回答

12

Postgres的處理自動遞增有點不同比MySQL一樣。在Postgres中,當您創建serial字段時,您還正在創建一個跟蹤要使用的id的序列字段。此序列字段將從數值1開始。

向表中插入新記錄時,如果未指定id字段,它將使用序列值,然後增加序列。但是,如果您確實指定了id字段,則不會使用該序列,也不會更新。

我假設當你移動到Postgres時,你會播種或導入一些現有的用戶,以及他們現有的ID。當您使用其id創建這些用戶記錄時,該序列未被使用,因此從未更新過。

因此,例如,如果您導入了10個用戶,則用戶的ID爲1-10,但序列仍然爲1.當您嘗試創建新用戶而未指定ID時,它會將值從序列(1)開始,並且由於已有用戶ID爲1,您將獲得唯一的違規。

要解決此問題,您需要將users_id_seq序列值設置爲現有用戶的MAX(id) 。您可以重置序列的詳細信息,請閱讀this question/answer,但你也可以嘗試這樣(未經):

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

僅供參考,這不是MySQL的問題,因爲MySQL的自動更新自動遞增序列當手動將值插入到自動遞增字段中時,將列的值設置爲最大列值。

+0

你100%正確,我手動提供ID後,現在它工作得很好。 – ihue

相關問題