Как «вставить или обновить» в зависимости от условий, таких как «где комната=»гостиная» и сад =»зеленый» в PostgreSQL

#postgresql

Вопрос:

я хотел бы обновить строку, если некоторые поля имеют определенные значения («идентификатор» на данный момент неясен), или вставить, если эта комбинация совершенно новая. Возможно ли это без процедуры, и если да, то как? Я думаю, что это как-то работает с «конфликтом», но я не могу этого понять. Спасибо

Пример:

UPDATE table_name SET column1 = value1, column2 = value2, WHERE column1 = 1 and column2 = 2;

если нет набора данных, где column1 = 1 и column2 = 2, сделайте это:

INSERT INTO table_name (column1, column2, column3, column4) VALUES (value1, value2, value3, value4);

Возможно ли реализовать это всего одним запросом?

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

1. Спросите еще раз, когда у вас будут четкие, конкретные требования.

2. @LaurenzAlbe я надеюсь, что с моим примером теперь все ясно.

3. ваше обновление не имеет для меня смысла, поскольку вы изменяете столбцы, которые также используются для поиска строк в предложении WHERE. Вы имели в виду обновление column3 и column4 в заявлении об ОБНОВЛЕНИИ?

4. @a_horse_with_no_name о, извините, вы правы.

Ответ №1:

Вам нужен уникальный индекс или ограничение (column1, column2) , тогда вы можете сделать:

 INSERT INTO table_name (column1, column2, column3, column4) 
VALUES (value1, value2, value3, value4)
on conflict (column1, column2) 
  do update 
    set column3 = excluded.column3, 
        column4 = excluded.column4;
 

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

1. Вы имеете в виду, что значения столбцов 1 и 2 должны быть уникальными? Но они не уникальны, сочетание делает их уникальными, вот в чем проблема…

2. @PeterFox: вот чего достигнет уникальное ограничение (column1, column2)