SQL-ловушка: этот UPDATE может незаметно испортить данные в продакшене
Код корректный, PostgreSQL не выдаст ошибку. Но результат не так очевиден.
Есть таблица товаров:
CREATE TABLE products (
id INT PRIMARY KEY,
price INT
);
INSERT INTO products VALUES (1, 100);
Применяем скидки:
WITH discounts(id, amount) AS (
VALUES (1, 10), (1, 20)
)
UPDATE products p
SET price = p.price - d.amount
FROM discounts d
WHERE p.id = d.id;
SELECT price FROM products;
Что вернёт последний SELECT?
А) 90
Б) 80
В) 70
Г) 80 или 90, результат не гарантирован
Один запрос, две скидки на один товар. Как PostgreSQL обработает такой UPDATE?
Подвох связан с поведением UPDATE ... FROM, о котором легко забыть даже при работе с реальными базами.
❤4👍4
8 · 327 ·