Laravel Appでpsqlを使用しています。ユーザーを作成しようとしていますが、このエラーが発生し続けます
一意の違反:7エラー:重複するキー値が一意の制約「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
を使用してアプリをフックすると、現在使用しているものが機能していました。
ヒント/提案は私にとって多くのことを意味します。
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 を読むことができますが、(unested)のようなものを試すこともできます:
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id),1), false) FROM users;
ちなみに、自動インクリメントフィールドに値を手動で挿入すると、MySQLは自動インクリメントシーケンスを最大列値に自動的に更新するため、これはMySQLの問題ではありません。