Несколько `КОНФЛИКТНЫХ ситуаций » в запросе вставки

#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;