Предположим, что я управляю простой таблицей. Кроме того, каждый пользователь может косвенно создавать копию каждой строки и изменять ее самостоятельно.Постоянное «уникальное нарушение ограничений» на пустой таблице при вставке
Вот мои настройки:
-- the original table
CREATE TABLE test
(
id integer PRIMARY KEY,
a integer,
b integer NOT NULL,
c integer
);
-- the table holding a modified copy of the former table
CREATE TABLE test_copy
(
copy_position integer NOT NULL, -- some additional data attached to the copy
id integer PRIMARY KEY REFERENCES test(id), -- the id of the copied row
a integer,
b integer NOT NULL,
c integer
);
-- some sample data
INSERT INTO test VALUES (1, 4, 4, 4), (2, 7, 3, 2), (3, 72, 23, 7), (4, 11, 22, 33);
Я должен создать функцию, которая делает копию существующей строки в таблице test
. Однако следующее заявление, которое должно было выполнять работу, не удается: выдается
INSERT INTO test_copy(copy_position, id, a, b, c)
(SELECT 666, 3, t.a, t.b, t.c
FROM test AS t);
следующая ошибка:
ERROR: duplicate key value violates unique constraint "test_copy_pkey"
DETAIL: Key (id)=(3) already exists.
В таблице test_copy
совершенно пуст. Первый оператор является единственным оператором INSERT
, снабжающим таблицу любыми строками, и все же он каким-то образом нарушает уникальное ограничение. Вставка значений вручную, без подзапроса SELECT
выполняется успешно. После нескольких часов исследований у меня закончились идеи, что может быть причиной ошибки, и я чувствую, что решение этой проблемы должно быть очень простым. Я использую PostgreSQL 9.4.
Вы выбираете (константу) значение '3' для ** каждой ** строки в' test' как значение для столбца 'id' в целевой таблице. Поскольку исходная таблица содержит более одной строки, вы пытаетесь вставить значение '3' несколько раз в' test_copy', которое вам не разрешено делать, потому что 'id' определяется как первичный ключ –
Христос всемогущий ... Я забыл предложение WHERE.Это должна быть самая глупая ошибка, которую я когда-либо делал, по сравнению с суммой всей работы, потраченной впустую, чтобы найти фактический источник проблемы. Этот вопрос не должен быть здесь. Тем не менее, спасибо. Если вы сделаете этот комментарий в ответ, я сразу приму его (поскольку это был первый «ответ» в моих глазах) и исчезнуть в бездне стыда. ура – Tomalla