#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. Я не думаю, что это возможно только с повышением. Возможно, триггер-это то, что вам нужно 😉