Я получаю следующую ошибку при выполнении следующего типа вставки:
Query:
INSERT INTO accounts (type, person_id) VALUES ('PersonAccount', 1) ON
CONFLICT (type, person_id) WHERE type = 'PersonAccount' DO UPDATE SET
updated_at = EXCLUDED.updated_at RETURNING *
Ошибка:
Выполнение SQL не выполнено (Причина: ОШИБКА: нет уникального исключения ограничение, соответствующее спецификации ON CONFLICT)
У меня также есть уникальный INDEX:
CREATE UNIQUE INDEX uniq_person_accounts ON accounts USING btree (type,
person_id) WHERE ((type)::text = 'PersonAccount'::text);
Дело в том, что иногда это работает, но не каждый раз. Я беспорядочно получаю это исключение, которое действительно странно. Кажется, что он не может получить доступ к этому INDEX или он не знает, что он существует.
Любое предложение?
Я использую PostgreSQL 9.5.5.
Пример при выполнении кода, который пытается найти или создать учетную запись:
INSERT INTO accounts (type, person_id, created_at, updated_at) VALUES ('PersonAccount', 69559, '2017-02-03 12:09:27.259', '2017-02-03 12:09:27.259') ON CONFLICT (type, person_id) WHERE type = 'PersonAccount' DO UPDATE SET updated_at = EXCLUDED.updated_at RETURNING *
SQL execution failed (Reason: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification)
В этом случае я уверен, что учетной записи не существует. Кроме того, он никогда не выводит ошибку, если у человека уже есть учетная запись. Проблема в том, что в некоторых случаях она также работает, если учетной записи еще нет. Запрос точно такой же.