У меня есть эта таблица (сгенерированная Django):
CREATE TABLE feeds_person (
id serial PRIMARY KEY,
created timestamp with time zone NOT NULL,
modified timestamp with time zone NOT NULL,
name character varying(4000) NOT NULL,
url character varying(1000) NOT NULL,
email character varying(254) NOT NULL,
CONSTRAINT feeds_person_name_ad8c7469_uniq UNIQUE (name, url, email)
);
Я пытаюсь навалом вставить много данных, используя INSERT
с предложением ON CONFLICT
.
Морщина заключается в том, что мне нужно вернуть id
для всех строк, независимо от того, существуют они уже или нет.
В других случаях я бы сделал что-то вроде:
INSERT INTO feeds_person (created, modified, name, url, email)
VALUES blah blah blah
ON CONFLICT (name, url, email) DO UPDATE SET url = feeds_person.url
RETURNING id
Выполнение UPDATE
заставляет оператор возвращать id
этой строки. Кроме того, эта таблица не работает. Я думаю, что это не сработает, потому что у меня несколько уникальных полей, тогда как в других случаях я использовал этот метод, у меня было только одно уникальное поле.
Я получаю эту ошибку при попытке запуска SQL через курсор Django:
django.db.utils.ProgrammingError: ON CONFLICT DO UPDATE command cannot affect row a second time HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values.
Как сделать объемную вставку с этой таблицей и вернуть вставленные и существующие идентификаторы?