Postgres ПРИ КОНФЛИКТЕ ОБНОВЛЕНИЕ не запускается, если другие ограничения не срабатывают

#postgresql

Вопрос:

Рассмотрим следующий SQL:

 CREATE TABLE external_item (
  id SERIAL PRIMARY KEY,
  external_id TEXT UNIQUE,
  enabled BOOLEAN NOT NULL CHECK (enabled = false OR external_id IS NOT NULL)
);

INSERT INTO external_item (id, enabled, external_id)
     VALUES (1, true, 'ext_id_1');

INSERT INTO external_item (id, enabled)
     VALUES (1, true)
ON CONFLICT (id)
  DO UPDATE
        SET enabled = excluded.enabled;

--> ERROR: new row for relation "external_item" violates check constraint "external_item_check"
--> DETAIL: Failing row contains (1, null, t).
 

Запрос завершается неудачно, потому что вставка не проходит контрольное ограничение. Все работает нормально, если вы опустите определение CHECK из таблицы. Есть ли какой-то способ установить приоритет ограничения или что-то в этом роде, чтобы Postgres прибегал к ON CONFLICT DO UPDATE заявлению, прежде чем утверждать другие проверки?

Комментарии:

1.только on conflict как описано в руководстве, речь идет об уникальных или исключающих ограничениях и ни о чем другом.

2. Я не думаю, что это возможно только с повышением. Возможно, триггер-это то, что вам нужно 😉