Непонятно, что вы подразумеваете под "всегда ноль"?
CONCAT
должен возвращать строковое значение или NULL.
На основе предоставленного кода результат выражения CONCAT
присваивается пользовательской переменной @description
.
Мы замечаем, что INSERT
не указывает столбцы, в которые нужно вставить. Возможно ли, что вводимые вами значения не совпадают со столбцами в таблице.
Укажите имена столбцов в порядке, соответствующем порядку предоставленных значений
INSERT INTO History (col3, col1, col4, col2)
VALUES (NEW.user_id, 'weight', @description, null)
И убедитесь, что столбец, в который мы вставляем строковое значение, имеет тип символа, а не числовой (MySQL будет молча выполнять неявное преобразование строк в числовые, ... в качестве простой демонстрации поведения рассмотрим:
SELECT 'foo' + 0 AS c1
, '123abc' + 0 AS c2
Если это не проблема, тогда ...
Если вы имели в виду, что результат NEW.weight - OLD.weight
оценивается как ноль, это произойдет, когда значения NEW.
и OLD.
weight
равны.
Если weight
может быть НЕДЕЙСТВИТЕЛЕН, рассмотрите возможность проверки других условий, например, с помощью инструкции MySQL CASE
(доступной в хранимой программе MySQL, не путать с выражением CASE
.)
CASE
WHEN NEW.weight < OLD.weight
THEN SET @description = CONCAT('You lost ', OLD.weight - NEW.weight, ' kgs');
WHEN NEW.weight > OLD.weight
THEN SET @description = CONCAT('You gained ', NEW.weight - OLD.weight, ' kgs');
WHEN NEW.weight = OLD.weight
THEN SET @description = 'Weight is unchanged';
ELSE SET @description = 'NEW and/or OLD weight IS NULL';
END
Для отладки рассмотрите сохранение этих значений в пользовательских переменных (чтобы вы могли запрашивать переменные после запуска триггера из того же сеанса).
Или рассмотрите возможность добавления значений к описательному сообщению,
CONCAT(...,' ow=',IFNULL(OLD.weight,'NULL'),' nw=',IFNULL(NEW.weight,'NULL'))