Уникальное нарушение: 7 ошибка: повторяющееся значение ключа нарушает уникальное ограничение " users pkey"
Я использую psql в своем приложении Laravel. Я пытаюсь создать своего пользователя, и я продолжаю получать эту ошибку
уникальное нарушение: 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")
);
$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
.
любые подсказки / предложения будут много значить для меня.
скриншот
1 ответов
Postgres обрабатывает автоматическое увеличение немного иначе, чем MySQL. В Postgres, когда вы создаете serial
поле, вы также создаете поле последовательности, которое отслеживает идентификатор для использования. Это поле последовательности будет начинаться со значения 1.
при вставке новой записи в таблицу, если не указать id
поле, оно будет использовать значение последовательности, а затем увеличивать последовательность. Однако, если вы укажете id
поле, затем последовательность не используется и не обновляется.
Я предполагаю, что когда вы переехали в Postgres, вы засеяли или импортировали некоторых существующих пользователей вместе с их существующими идентификаторами. При создании этих записей пользователей с их идентификаторами последовательность не использовалась и поэтому никогда не обновлялась.
Итак, если, например, вы импортировали 10 пользователей, у вас есть пользователи с идентификаторами 1-10, но ваша последовательность по-прежнему равна 1. При попытке создать нового пользователя без указания идентификатор, он извлекает значение из последовательности (1), и вы получите уникальную нарушения, потому что у вас уже есть пользователь с id 1.
чтобы решить проблему, вам нужно установить свой users_id_seq
значение последовательности для MAX (id) существующих пользователей. Вы можете читать вопрос/ответ для получения дополнительной информации о сбросе последовательность, но вы также можете попробовать что-то вроде (непроверенных):
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id),1), false) FROM users;
FYI, это не проблема в MySQL, потому что MySQL автоматически обновляет последовательность автоматического приращения до наибольшего значения столбца, когда значение вручную вставляется в поле автоматического приращения.