我在Mysql中创建了一个触发器,但由于某种原因,连接的结果总是为零。我错过了什么?
BEGIN
IF NEW.weight < OLD.weight THEN
SET @description = CONCAT('You lost ', OLD.weight - NEW.weight, ' kgs');
ELSE
SET @description = CONCAT('You gained ', NEW.weight - OLD.weight, ' kgs');
END IF;
INSERT INTO History
VALUES (NEW.user_id, 'weight', @description, null);
END
答案 0 :(得分:0)
不清楚你的意思是&#34;总是零&#34;?
CONCAT
应该返回一个字符串值,或者返回NULL。
根据提供的代码,CONCAT
表达式的结果将分配给用户定义的变量@description
。
我们注意到INSERT
没有指定要插入的列。您插入的值是否有可能排除&#34;排队&#34;与表中的列。
指定列的名称,按顺序对应提供值的顺序
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.
的{{1}}和OLD.
值相等,就会发生这种情况。
如果weight
可以为NULL,请考虑检查其他条件,例如,使用MySQL weight
语句(在MySQL存储程序中可用,不要与CASE
表达式混淆。 )
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