#sql #postgresql
Вопрос:
У меня есть таблица, в которой есть столбцы типа id, name, start_date, end_date
и 2 уникальных ограничения unique(id, name, start_date)
и unique(id, name, end_date)
теперь, когда я пишу запрос на вставку для этой таблицы, у меня есть что-то вроде
insert into table (id, name, start_date, end_date)
values (1, 'test', 'example-start-date', 'example-end-date')
on conflict (id, name, start_date) set something
on conflict (id, name, end_date) set something
но получать ошибки, разве это не разрешено?
Спасибо
Комментарии:
1. Как указано в руководстве , это не допускается
Ответ №1:
Ответ зависит от something
того .
- Ибо
DO NOTHING
ответ состоит в том , чтобы просто использовать одно предложение без указания столбцов:ON CONFLICT DO NOTHING
Это может иметь дело с конфликтами по нескольким уникальным ограничениям.
- Ибо
DO UPDATE
простого решения не существует. Синтаксическая схема в документации показывает, что у вас может быть только одноON CONFLICT
предложение, определяющее один уникальный индекс.Вы можете использовать процедурный код, чтобы сделать это старомодным способом, например, в PL/pgSQL:
DECLARE v_constraint text; BEGIN LOOP -- endless loop until INSERT or UPDATE succeeds BEGIN INSERT INTO ...; EXIT; -- leave loop if INSERT succeeds EXCEPTION WHEN unique_violation THEN GET STACKED DIAGNOSTICS v_constraint := CONSTRAINT_NAME; END; CASE v_constraint WHEN 'constraint_name_1' THEN UPDATE ...; WHEN 'constraint_name_2' THEN UPDATE ...; END CASE; EXIT WHEN FOUND; -- leave loop if UPDATE changed a row END LOOP; END;