INSERT, UPDATE, DELETE и RETURNING

Меняем данные в таблице тремя командами и узнаём про фирменный RETURNING в PostgreSQL.

RETURNING — расширение PostgreSQL, которое возвращает изменённые строки прямо из команды INSERT, UPDATE или DELETE.

INSERT: добавляем строки

Базовая вставка переносима и работает в песочнице. Можно добавлять сразу несколько строк одной командой.

CREATE TABLE products (
    id    INTEGER PRIMARY KEY,
    name  TEXT,
    stock INTEGER
);

INSERT INTO products (id, name, stock) VALUES
    (1, 'Кофе', 50),
    (2, 'Чай', 30),
    (3, 'Сахар', 0);

SELECT * FROM products;

Вывод:

1|Кофе|50
2|Чай|30
3|Сахар|0

UPDATE: обновляем строки

UPDATE меняет значения в существующих строках. Критически важно не забывать WHERE — без него обновятся все строки таблицы.

-- Пополнили склад сахара
UPDATE products
SET stock = stock + 100
WHERE name = 'Сахар';

SELECT name, stock FROM products WHERE name = 'Сахар';

Вывод:

Сахар|100

Заметьте: в SET можно использовать текущее значение столбца — stock = stock + 100 прибавляет к уже имеющемуся.

DELETE: удаляем строки

DELETE убирает строки по условию. Здесь WHERE ещё важнее: DELETE FROM products; без условия очистит всю таблицу.

DELETE FROM products WHERE stock = 0;
SELECT name, stock FROM products ORDER BY id;

Вывод:

Кофе|50
Чай|30
Сахар|100

Строки с нулевым остатком исчезли. На момент удаления у сахара уже было 100, поэтому он остался.

RETURNING — фирменная фишка PostgreSQL

Обычно после INSERT нужно узнать сгенерированный id, и приходится делать отдельный SELECT. PostgreSQL решает это одним движением: RETURNING отдаёт изменённые строки сразу.

-- Вставить и сразу получить присвоенный id
INSERT INTO products (name, stock)
VALUES ('Какао', 20)
RETURNING id, name;

-- Узнать, какие строки обновились
UPDATE products
SET stock = 0
WHERE stock < 10
RETURNING id, name, stock;

-- Получить удалённые строки (например, для лога)
DELETE FROM products
WHERE stock = 0
RETURNING *;

RETURNING экономит запрос и устраняет гонку: вы получаете именно те данные, которые только что изменили, в той же команде. В обычном SQLite такого нет — поэтому помечаем блок как pgsql.

Итог

  • INSERT добавляет строки (можно много за раз), UPDATE меняет, DELETE удаляет.
  • В UPDATE и DELETE всегда проверяйте WHERE — без него операция затронет всю таблицу.
  • RETURNING — расширение PostgreSQL: возвращает изменённые строки прямо из команды, экономя отдельный SELECT.
Проверьте себя
1. Что произойдёт, если выполнить UPDATE без WHERE?
AОшибка синтаксиса
BОбновятся все строки таблицы
CНе обновится ни одной строки
DОбновится только первая строка
2. Что делает предложение RETURNING в PostgreSQL?
AОткатывает транзакцию
BВозвращает изменённые строки прямо из INSERT/UPDATE/DELETE
CСоздаёт резервную копию
DСортирует результат
3. Почему запись SET stock = stock + 100 корректна?
AЭто ошибка, так писать нельзя
BВ UPDATE можно использовать текущее значение столбца для вычисления нового
Cstock здесь — это новая переменная
DТак обнуляется столбец
Поддержать проект