Ошибка "дублирующий ключ" (PostgreSQL) - PullRequest
4 голосов
/ 28 февраля 2011

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

Когда я пытаюсь вставить новую запись в мой service таблица - только в производстве - я получаю это:

ActiveRecord::RecordNotUnique (PGError: ERROR:  duplicate key value violates unique constraint "service_pkey"
: INSERT INTO "service" ("created_at", "name", "salon_id", "updated_at") VALUES ('2011-02-28 02:34:20.054269', 'Manicure', 1, '2011-02-28 02:34:20.054269') RETURNING "id"):
  app/controllers/services_controller.rb:46
  app/controllers/services_controller.rb:45:in `create'

Я не понимаю, почему.Разве это не должно автоматически увеличивать PK для меня?

Вот определение таблицы:

snip=> \d service
                                     Table "public.service"
   Column   |            Type             |                      Modifiers                       
------------+-----------------------------+------------------------------------------------------
 id         | integer                     | not null default nextval('service_id_seq'::regclass)
 name       | character varying(255)      | 
 salon_id   | integer                     | 
 created_at | timestamp without time zone | 
 updated_at | timestamp without time zone | 
Indexes:
    "service_pkey" PRIMARY KEY, btree (id)

А вот определение для той же самой таблицы в разработке, где она работает нормально:

snip_development=> \d service
                                     Table "public.service"
   Column   |            Type             |                      Modifiers                       
------------+-----------------------------+------------------------------------------------------
 id         | integer                     | not null default nextval('service_id_seq'::regclass)
 name       | character varying(255)      | 
 salon_id   | integer                     | 
 created_at | timestamp without time zone | 
 updated_at | timestamp without time zone | 
Indexes:
    "service_pkey" PRIMARY KEY, btree (id)

То же самое!Так что же это может быть?

1 Ответ

15 голосов
/ 28 февраля 2011

Возможно, вы загрузили таблицу с данными, но не указали для установки текущего значения service_id_seq на нужное значение. Вы можете просто SELECT * FROM service_id_seq проверить текущие значения и использовать функцию setval для сброса.

Например, SELECT setval('service_id_seq'::regclass, MAX(id)) FROM service; должен сбросить последовательность до текущего максимального значения из таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...