Как сделать функцию SQL postgres, которая использует значение из удаленной строки?

Как я могу создать функцию SQL postgres, которая использует значение из удаленной строки в следующем запросе? Это легко сделать в PLPGSQL с помощью переменной, но поскольку в функциях SQL нет переменных, как мне это сделать?

delete from mytable where key1 = '1' and key2 = '2' returning otherkey;
update mytable set otherkey = OTHERKEY where key1 = '1' and otherkey = '2';
-- "OTHERKEY" is the value returned by the first query

Есть ли способ сделать это с помощью подзапроса?


person user779159    schedule 16.04.2020    source источник


Ответы (1)


Postgres поддерживает операторы модификации данных в CTE — с предложением return.

Итак, вы можете делать именно то, что хотите:

with d as (
      delete from mytable
          where key1 = '1' and key2 = '2'
          returning otherkey
     )
update mytable
    set otherkey = d.OTHERKEY
    from d
    where key1 = '1' and otherkey = '2';
person Gordon Linoff    schedule 16.04.2020
comment
Поскольку CTE может возвращать несколько строк, как оператор update узнает, что d.OTHERKEY — это просто одно значение, а не несколько значений? Не может ли быть несколько значений? Если бы я использовал его в ГДЕ, разве мне не пришлось бы говорить where column in (d.OTHERKEY), а не where column = d.OTHERKEY? - person user779159; 16.04.2020
comment
@user779159 . . . Это отвечает на вопрос, который вы задали, а именно, как объединить delete и update в Postgres. Ваш вопрос конкретно в единственном числе удаленной строки. Ваш вопрос не касается связи между таблицами. Однако, если есть первичный ключ, вы должны включить его в условие where. - person Gordon Linoff; 16.04.2020
comment
Что касается вашего редактирования, действительно ли оно не обновит какие-либо значения? Предложения where в обоих запросах разные. - person user779159; 16.04.2020
comment
Если returning возвращает одну строку, то postgres позволяет вам использовать ее после знака равенства для проверки на равенство. Но если он вернет более одной строки, то запрос выдаст ошибку во время выполнения? - person user779159; 16.04.2020
comment
@user779159 . . . Нет. Я думаю, что он обновит все совпадающие строки с произвольным значением OTHERKEY из одной из строк в d. - person Gordon Linoff; 16.04.2020