不清楚您所说的“始终为零”是什么意思?
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 的结果计算为零,那么只要weight 的NEW. 和OLD. 值相等,就会发生这种情况。
如果weight 可以为NULL,请考虑检查其他条件,例如,使用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'))