Как обновлять строку только при большем значении в 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. Практикуйтесь на тестовой базе, чтобы избежать ошибок в продакшене.

    Часто задаваемые вопросы