在变量中连接的Mysql触发器不起作用

时间:2018-05-08 17:11:28

标签: mysql triggers concatenation

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

1 个答案:

答案 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