web-dev-qa-db-ja.com

一意の違反:7エラー:重複するキー値が一意の制約「users_pkey」に違反しています

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を使用してアプリをフックすると、現在使用しているものが機能していました。

ヒント/提案は私にとって多くのことを意味します。


スクリーンショット

enter image description here

15
cyber8200

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の問題ではありません。

27
patricus