Я получаю следующее сообщение об ошибке при выполнении следующих типов вставки:Нет уникальных или исключение ограничений согласования ON КОНФЛИКТ
Запрос:
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 execution failed (Reason: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification)
I также имеют уникальный ИНДЕКС:
CREATE UNIQUE INDEX uniq_person_accounts ON accounts USING btree (type,
person_id) WHERE ((type)::text = 'PersonAccount'::text);
Дело в том, что иногда это работает, но не каждый раз. I случайно получить это исключение, что действительно странно. Похоже, что он не может получить доступ к этому индексу или он не знает, что он существует.
Любое предложение?
Я использую 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)
В этом случае, я уверен, что учетная запись не существует. Кроме того, он никогда не выводит ошибку, если у человека уже есть учетная запись. Проблема в том, что в некоторых случаях она также работает, если учетной записи еще нет. Запрос точно такой же.
может быть, потому что это частичный индекс .. –
Вы можете уточнить? –
@VaoTsun частичные индексы поддерживаются 'ON CONFLICT' – pozs