2016-06-22 96 views
5

私はLaravel Appでpsqlを使用しています。 私は私のユーザーを作成しようとしている、と私は ユニーク違反:7 ERROR:重複するキー値が一意性制約「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(); 
ここ

は、私が作成したかである私のユーザー保存するために何をしたかここでは、このエラー

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


を得続ける私ユーザーテーブル

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

エラー。 –

+0

psqlとmysqlの間のdiffでなければなりません。 – ihue

+0

私のpkeyとして/ idを作る方法は?出来ますか ? – ihue

答えて

12

Postgresは異なり、MySQLはよりも少しインクリメント自動処理します。あなたがserialフィールドを作成するときのPostgresでは、あなたはまた、使用するIDを追跡されたシーケンスフィールドを作成しています。このシーケンスフィールドの値は1から始まります。

idフィールドを指定しないと、新しいレコードをテーブルに挿入すると、シーケンスの値が使用され、インクリメントされますシーケンス。ただし、idフィールドを指定すると、シーケンスは使用されず、更新もされません。

私はあなたがPostgresのに上に移動するとき、あなたは彼らの既存のIDと一緒にいくつかの既存のユーザーを、播種またはインポートすることを想定しています。これらのユーザーレコードをIDで作成した場合、シーケンスは使用されなかったため、更新されませんでした。

たとえば、10人のユーザーをインポートした場合、IDは1〜10ですが、シーケンスは1のままです。idを指定せずに新しいユーザーを作成しようとすると、 (1)のシーケンスから削除してください。

問題を解決するには、users_id_seqシーケンス値を既存のユーザーのMAX(ID)に設定する必要があります。あなたが順序をリセットの詳細については、this question/answerを読み取ることができますが、あなたも(未テスト)のような何かを試すことができます:MySQLは自動的に自動インクリメント列を更新するため、

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

、これは、MySQLでの問題ではありません値を手動で自動インクリメントフィールドに挿入すると、最大の列値に変更されます。あなたは、インサートにusers_pkeyを持っていない、そして最も可能性が高いそれDBで自動インクリメント値にするので、それはあなたを引き起こし、すでにテーブル内の別の場所に存在するたまたまデフォルト値を取得しませんでした

+0

IDを手動で入力した後は100%正確ですが、現在は完全に正常に動作しています。 – ihue

関連する問題