Пошук уроків, статей та іншого контенту
Змініть дані в наявних рядках за умовою та навчіться уникати випадкового оновлення всієї таблиці.
UPDATEОператор UPDATE змінює значення в уже наявних рядках таблиці.
Базовий синтаксис:
UPDATE назва_таблиці
SET назва_стовпця = нове_значення
WHERE умова;UPDATE
SET задає нові значення.
WHERE обмежує рядки, які потрібно оновити.
Якщо не вказати WHERE, PostgreSQL оновить усі рядки таблиці.
Нехай маємо таблицю товарів:
CREATE TEMP TABLE products (
id integer PRIMARY KEY,
name text NOT NULL,
price numeric(10, 2) NOT NULL,
stock integer NOT NULL,
is_active boolean NOT NULL
);
INSERT INTO products (id, name, price, stock, is_active)
VALUES
(1, 'Keyboard', 80.00, 15, true),
(2, 'Mouse', 35.00, 0, true),
(3, 'Monitor', 250.00, 5, true),
(4, 'Webcam', 120.00, 0, false);Змінимо ціну товару з id = 1:
UPDATE products
SET price = 85.00
WHERE id = 1;Перевіримо результат:
SELECT *
FROM products
WHERE id = 1;Тепер ціна товару з ідентифікатором 1 дорівнює 85.00.
В одному операторі UPDATE можна змінити кілька стовпців:
UPDATE products
SET price = 40.00,
stock = 20,
is_active = true
WHERE id = 2;Коми між призначеннями потрібні, але після останнього стовпця кома не ставиться.
Умова може стосуватися будь-яких стовпців. Наприклад, позначимо всі товари без залишку як неактивні:
UPDATE products
SET is_active = false
WHERE stock = 0;Цей запит змінить усі рядки, у яких stock дорівнює 0.
Можна поєднувати кілька умов:
UPDATE products
SET price = price * 0.90
WHERE is_active = true
AND stock > 0;У цьому випадку ціна активних товарів, які є на складі, зменшиться на 10%.
У правій частині присвоєння можна використовувати поточне значення стовпця:
UPDATE products
SET stock = stock + 10
WHERE id = 3;Значення stock збільшується на 10, а не замінюється фіксованим числом.
Так само можна збільшити ціну на фіксовану суму:
UPDATE products
SET price = price + 5.00
WHERE price < 100.00;RETURNINGPostgreSQL підтримує RETURNING, який повертає рядки, змінені оператором UPDATE.
UPDATE products
SET stock = stock + 5
WHERE is_active = true
RETURNING id, name, stock;Результатом будуть ідентифікатори, назви та нові значення залишку всіх оновлених товарів.
RETURNING корисний, коли потрібно:
перевірити, які рядки були змінені;
отримати нові значення без окремого SELECT;
зрозуміти, чи справді умова знайшла потрібні рядки.
Можна повернути всі стовпці:
UPDATE products
SET is_active = true
WHERE id = 4
RETURNING *;Перед оновленням за складною умовою корисно спочатку виконати такий самий SELECT:
SELECT id, name, price
FROM products
WHERE is_active = true
AND stock > 0;Якщо вибірка містить саме потрібні рядки, можна виконати UPDATE з тією самою умовою:
UPDATE products
SET price = price * 0.95
WHERE is_active = true
AND stock > 0
RETURNING id, name, price;Так легше помітити помилку в умові до зміни даних.
WHEREЗапит без WHERE оновлює всю таблицю:
UPDATE products
SET is_active = false;Після цього всі товари в таблиці стануть неактивними.
Такий запит іноді є навмисним, але перед виконанням потрібно чітко переконатися, що саме цього очікує задача. У більшості випадків відсутність WHERE є помилкою.
Якщо потрібно перевірити результат перед остаточним збереженням, можна виконати оновлення в транзакції:
BEGIN;
UPDATE products
SET price = price * 1.10
WHERE is_active = true
RETURNING id, name, price;
-- Якщо результат правильний:
COMMIT;Якщо результат виявився неправильним, замість COMMIT можна виконати:
ROLLBACK;ROLLBACK скасує зміни, виконані в цій транзакції.
NULLПорівняння з NULL через = не працює як звичайне порівняння:
-- Неправильна перевірка
UPDATE products
SET is_active = false
WHERE some_column = NULL;Для перевірки NULL використовують IS NULL, а для перевірки значення, яке не є NULL, — IS NOT NULL:
UPDATE products
SET is_active = false
WHERE discontinued_at IS NOT NULL;У наведеній таблиці products стовпця discontinued_at немає, тому цей приклад показує лише загальний синтаксис для таблиці, де такий стовпець існує.
CREATE TEMP TABLE products (
id integer PRIMARY KEY,
name text NOT NULL,
price numeric(10, 2) NOT NULL,
stock integer NOT NULL,
is_active boolean NOT NULL
);
INSERT INTO products (id, name, price, stock, is_active)
VALUES
(1, 'Keyboard', 80.00, 15, true),
(2, 'Mouse', 35.00, 0, true),
(3, 'Monitor', 250.00, 5, true),
(4, 'Webcam', 120.00, 0, false);
-- Перевіряємо рядки перед оновленням
SELECT id, name, price, stock
FROM products
WHERE is_active = true
AND stock > 0;
-- Зменшуємо ціну активних товарів, які є на складі
UPDATE products
SET price = price * 0.90
WHERE is_active = true
AND stock > 0
RETURNING id, name, price;
-- Позначаємо товари без залишку як неактивні
UPDATE products
SET is_active = false
WHERE stock = 0
RETURNING id, name, is_active;
-- Переглядаємо фінальний стан таблиці
SELECT *
FROM products
ORDER BY id;WHEREUPDATE products
SET price = 0;Ціна стане 0 у всіх рядках. Якщо потрібно оновити один товар, додайте умову:
UPDATE products
SET price = 0
WHERE id = 2;Наприклад:
UPDATE products
SET is_active = false
WHERE price < 200;Це змінить усі товари дешевші за 200, а не один конкретний товар. Перед запитом перевірте кількість і склад рядків через SELECT.
UPDATE products
SET price = price * 10
WHERE id = 1;Ціна збільшиться в десять разів. Для збільшення на 10% потрібно використовувати множник 1.10:
UPDATE products
SET price = price * 1.10
WHERE id = 1;UPDATE products
SET stock = 10
WHERE id = 3;Це встановить залишок рівно в 10.
Якщо потрібно додати 10 до поточного залишку, використовуйте:
UPDATE products
SET stock = stock + 10
WHERE id = 3;UPDATE завжди змінить рядокЯкщо умова WHERE не відповідає жодному рядку, помилки не буде, але жоден рядок не зміниться. RETURNING допоможе це помітити:
UPDATE products
SET price = 99.00
WHERE id = 999
RETURNING *;Порожній результат означає, що рядок із таким ідентифікатором не знайдено.
UPDATE змінює дані в наявних рядках.
Нові значення задають після SET.
WHERE визначає, які саме рядки потрібно оновити.
UPDATE без WHERE змінює всі рядки таблиці.
Поточне значення можна використовувати у виразі, наприклад stock = stock + 10.
Для зміни кількох стовпців призначення розділяють комами.
RETURNING повертає оновлені рядки та їхні нові значення.
Перед складним UPDATE корисно перевірити умову через SELECT.
Для безпечної перевірки результату можна використовувати транзакцію з COMMIT або ROLLBACK.