Иногда хочется вернуть строку БД сразу после обновления. Более того, можно ПРИСОЕДИНЯТЬ дополнительные данные к обновленной строке. Расширения RETURNING
и WITH
PostgreSQL делают это возможным.
Добавим несколько примеров данных:
CREATE TABLE birthdays ( name TEXT, birthday DATE, age SMALLINT ); INSERT INTO birthdays VALUES ('James', '1996-01-20', 22), ('Peter', '1990-06-18', 28), ('John', '1993-09-21', 25);
Используя оператор RETURNING
, можно вернуть любые столбцы из обновленных строк. Этот запрос вернет имя, дату рождения и возраст всех обновленных строк:
-- Update age if it is incorrect UPDATE birthdays SET age = date_part('year', age(birthday)) WHERE date_part('year', age(birthday)) != age RETURNING name, birthday, age;
Операторы WITH
позволяют использовать строки SELECTED в запросе (в данном случае update) в другом подзапросе. Давайте сделаем неявное соединение в обновленный день рождения с любимым цветом человека:
CREATE TABLE favourite_colour(name TEXT, colour TEXT); INSERT INTO favourite_colour VALUES ('James', 'Green'), ('Peter', 'Blue'), ('John', 'Magenta'); WITH updated AS ( UPDATE birthdays SET age = date_part('year', age(birthday)) WHERE date_part('year', age(birthday)) != age RETURNING name, birthday, age) SELECT updated.*, favourite_colour.colour FROM updated, favourite_colour WHERE updated.name = favourite_colour.name;
В последнем операторе обновленные строки добавляются к предложению FROM
, делая их столбцы доступными для предложений SELECT
и WHERE
.
Наконец, очистите:
DROP TABLE birthdays; DROP TABLE favourite_colour
Давай, попробуй!