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.