postgresql: ошибка дублирования значения ключа нарушает ограничение уникальности - PullRequest
1 голос
/ 01 августа 2011

Этот вопрос задавали несколько человек, но моя проблема, кажется, другая.
На самом деле я должен объединить те же структурированные таблицы из разных баз данных в postgresql в новую БД. Что я делаю, так это то, что я подключаюсь к удаленной базе данных с помощью dblink, считываю эту таблицу в этой базе данных и вставляю ее в таблицу в текущей базе данных, как показано ниже

INSERT INTO t_types_of_dementia SELECT * FROM dblink('host=localhost port=5432 dbname=snap-cadence password=xxxxxx', 'SELECT dementia_type, snapid FROM t_types_of_dementia') as x(dementia_type VARCHAR(256),snapid integer);

В первый раз этот запрос работает нормально, но когда я запускаю его снова или пытаюсь запустить его с таблицей какой-то другой удаленной базы данных: он выдает мне эту ошибку

ОШИБКА: двойное значение ключа нарушает уникальное ограничение "T_types_of_dementia_pkey"

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

Структура таблицы в текущем дБ

CREATE TABLE t_types_of_dementia(
    dementia_type VARCHAR(256),
    snapid integer NOT NULL,
    PRIMARY KEY (dementia_type,snapid)
);

P.S. Существует конкретная причина, по которой оба столбца используются в качестве первичного ключа, которая может не иметь отношения к данному обсуждению, поскольку такая же проблема возникает в других таблицах, где это не так.

1 Ответ

1 голос
/ 01 августа 2011

Как говорится в сообщении об ошибке - в столбцах dementia_type, snapid не может быть двух строк с одинаковым значением, поскольку они должны быть уникальными.

Вы должны убедиться, что две базы данных имеют одинаковые значения для dementia_type, snapid.

Обходной путь - добавить столбец в таблицу alter table t_types_of_dementia add column id serial generated always и использовать его в качестве первичного ключа вместо текущего.

...