Как обновлять строку только при большем значении в SQL
При работе с базами данных часто возникает задача: нужно обновить запись, только если новое значение в столбце (например, количество денег в месяц) превышает текущее. Это позволяет хранить только максимальное значение для каждой записи. В этой статье мы разберём, какие операторы сравнения и SQL-конструкции для этого подходят, включая примеры для MySQL, PostgreSQL и SQLite.
Операторы сравнения в SQL
SQL поддерживает стандартные операторы сравнения: > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), = (равно), <> (не равно). Они используются в условии WHERE, чтобы отфильтровать строки. Для нашей задачи ключевой оператор - >.
Обновление только при большем значении
Допустим, у вас есть таблица users с колонками name, surname и monthly_income. Вы получаете новое значение new_income из API. Чтобы обновить строку, только если новое значение больше текущего, используйте запрос вида:
UPDATE users
SET monthly_income = new_income
WHERE name = 'Иван'
AND surname = 'Петров'
AND new_income > monthly_income;Этот запрос обновит поле monthly_income только в том случае, если new_income больше, чем текущее значение в базе. Если новое значение меньше или равно - строка останется без изменений.
Особенности для разных СУБД
В MySQL и PostgreSQL описанный выше синтаксис работает напрямую. В SQLite тоже, но будьте внимательны: если столбец имеет тип INTEGER, сравнение числовое. Если вы используете Microsoft SQL Server, можно добавить проверку через CASE:
UPDATE users
SET monthly_income = CASE
WHEN new_income > monthly_income THEN new_income
ELSE monthly_income
END
WHERE name = 'Иван' AND surname = 'Петров';Этот вариант гарантирует, что значение обновится только при превышении, иначе останется прежним.
Как оставить только максимальное значение в столбце
Если нужно для каждой строки хранить глобальный максимум (например, максимальный доход за всё время), можно использовать триггер или процедуру. Но для простого случая - запрос с условием WHERE ... AND new_value > column_value - это оптимальное решение.
Если таблица обновляется периодически из API, оборачивайте запрос в транзакцию, чтобы избежать конфликтов при параллельных записях. Пример на PHP (PDO):
$pdo->beginTransaction();
$stmt = $pdo->prepare("UPDATE users SET monthly_income = :new_income WHERE name = :name AND surname = :surname AND :new_income > monthly_income");
$stmt->execute([':new_income' => $newIncome, ':name' => $name, ':surname' => $surname]);
$pdo->commit();Частые ошибки новичков
- Забыть условие WHERE - обновится вся таблица, что приведёт к потере данных. Всегда проверяйте, что условие уникально идентифицирует строку (например, по первичному ключу).
- Сравнение строк вместо чисел - если столбец хранит текст, оператор
>будет сравнивать лексикографически. Убедитесь, что тип данных - числовой. - Игнорирование NULL - если
monthly_incomeможет быть NULL, условиеnew_income > NULLвернёт неизвестность, и обновление не произойдёт. Перед сравнением обработайте NULL черезCOALESCEилиIS NULL.
Заключение
Используя оператор > в условии WHERE, вы легко реализуете логику «обновить только если новое значение больше». Это надёжный способ поддерживать актуальность данных без лишних проверок на стороне приложения. Для более сложных сценариев (например, сравнение по нескольким столбцам) применяйте подзапросы или CASE. Практикуйтесь на тестовой базе, чтобы избежать ошибок в продакшене.