Уникальное нарушение: 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")

);

сделал ли я что-нибудь, что я not предположим?

что я сейчас привык работа, когда я подключаю свое приложение с MySQL.

любые подсказки / предложения будут много значить для меня.


скриншот

enter image description here

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 автоматически обновляет последовательность автоматического приращения до наибольшего значения столбца, когда значение вручную вставляется в поле автоматического приращения.