在变量中串联的mysql触发器不起作用

fiei3ece  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(378)

我在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
gblwokeq

gblwokeq1#

不清楚你说的“永远是零”是什么意思? 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 可以为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'))

相关问题