2017-02-03 7 views
8

Я получаю следующее сообщение об ошибке при выполнении следующих типов вставки:Нет уникальных или исключение ограничений согласования 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) 

В этом случае, я уверен, что учетная запись не существует. Кроме того, он никогда не выводит ошибку, если у человека уже есть учетная запись. Проблема в том, что в некоторых случаях она также работает, если учетной записи еще нет. Запрос точно такой же.

+1

может быть, потому что это частичный индекс .. –

+0

Вы можете уточнить? –

+0

@VaoTsun частичные индексы поддерживаются 'ON CONFLICT' – pozs

ответ

1

я не имел шанс сыграть с UPSERT, но я думаю, что у Вас есть случай из docs:

Note that this means a non-partial unique index (a unique index without a predicate) will be inferred (and thus used by ON CONFLICT) if such an index satisfying every other criteria is available. If an attempt at inference is unsuccessful, an error is raised.

+1

Я также видел это в документации, но из моей интерпретации, если он не может вывести индекс, он всегда должен это делать, а не только иногда. Кроме того, это указывает на поведение для не-частичных уникальных индексов, которые не созданы. В моем случае я использую неполный уникальный индекс. –

Смежные вопросы