Повторяющийся ключ postgresql нарушает уникальное ограничение - PullRequest
15 голосов
/ 15 декабря 2010

Привет, у меня есть вопрос, я знаю, что он был опубликован много раз, но я не нашел ответа на свою проблему. Проблема в том, что у меня есть таблица и столбец "id", я хочу, чтобы это был уникальный номер, как обычно. Этот тип столбца является последовательным, и следующее значение после каждой вставки берется из последовательности, поэтому кажется, что все в порядке, но иногда эта ошибка все еще отображается Я не знаю почему? В документации написано, что последовательность дурака проф и всегда работает. Если я добавлю УНИКАЛЬНОЕ ограничение к этому столбцу, будет ли это? Я много раз работал на Postres, но эта ошибка появляется для меня впервые. Я сделал все как обычно, и у меня никогда не было этой проблемы раньше. Можете ли вы помочь мне найти ответ, который можно использовать в будущем для всех создаваемых таблиц? Допустим, у нас есть что-то простое:

CREATE TABLE comments
(
  id serial NOT NULL,
  some_column text NOT NULL,
  CONSTRAINT id_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE interesting.comments OWNER TO postgres;

Если я добавлю:

ALTER TABLE comments ADD CONSTRAINT id_id_key UNIQUE(id)

Будет ли это достаточно, или нужно сделать что-то еще?

Ответы [ 4 ]

47 голосов
/ 08 февраля 2014

В этой статье объясняется , что ваша последовательность может быть не синхронизирована и что вам нужно вручную синхронизировать ее.

Выдержка из статьи на случай, если URLизменения:

Если вы получаете это сообщение при попытке вставить данные в базу данных PostgreSQL:

ERROR:  duplicate key violates unique constraint

Это, вероятно, означает, что последовательность первичного ключа в таблицеработа с каким-то образом стала не синхронизирована, вероятно, из-за процесса массового импорта (или что-то в этом роде).Назовите это «ошибкой по замыслу», но, похоже, вам придется вручную сбросить индекс первичного ключа после восстановления из файла дампа.В любом случае, чтобы увидеть, не синхронизированы ли ваши значения, выполните следующие две команды:

SELECT MAX(the_primary_key) FROM the_table;   
SELECT nextval('the_primary_key_sequence');

Если первое значение больше второго значения, ваша последовательность не синхронизирована.Сделайте резервную копию вашей базы данных PG (на всякий случай), затем запустите thisL

SELECT setval('the_primary_key_sequence', (SELECT MAX(the_primary_key) FROM the_table)+1);

, который установит последовательность на следующее доступное значение, которое больше, чем любой существующий первичный ключ в последовательности.

3 голосов
/ 15 декабря 2010

Первичный ключ уже защищает вас от вставки повторяющихся значений, которые вы испытываете, когда получаете эту ошибку.Для этого не нужно добавлять другое уникальное ограничение.

Ошибка «дублирующий ключ» говорит о том, что работа не была выполнена, поскольку она создаст дубликат ключа, а не обнаружит, что дублированный ключ уже зафиксирован.к столу.

1 голос
/ 15 декабря 2010

С http://www.postgresql.org/docs/current/interactive/datatype.html

Примечание: до PostgreSQL 7.3, подразумевался последовательный UNIQUE.Это больше не автоматически.Если вы хотите, чтобы последовательный столбец содержал уникальное ограничение или первичный ключ, теперь он должен быть указан, как и для любого другого типа данных.

0 голосов
/ 20 октября 2018

Во-первых, я думал, что проблема была в последовательности :). Но ошибка говорит ОШИБКА: значение дублированного ключа нарушает уникальное ограничение «ndxregnum». Поэтому я ищу имя «ndxregnum» в моей базе данных. Я нашел это под моей таблицей индексов. Затем я удаляю "ndxregnum". Тогда ошибка исчезла. все возвращается на круги своя.

Надеюсь, это поможет вам ...

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