【问题标题】:Mysql trigger with concatenation in variable doesn't work带有变量连接的Mysql触发器不起作用
【发布时间】:2018-05-08 17:11:28
【问题描述】:

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

【问题讨论】:

    标签: mysql triggers concatenation


    【解决方案1】:

    不清楚您所说的“始终为零”是什么意思?

    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 的结果计算为零,那么只要weightNEW.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'))
    

    【讨论】:

    • 非常感谢您的详尽解释。我所说的“连接的结果始终为零”的意思是 @description 的内容在表 History 中始终为 '0'。但我发现问题出在哪里......由于某种无法解释的原因,描述值的列设置为 DOUBLE 而不是 TEXT 或 VARCHAR。所以这就是它进入0的原因。我现在觉得很愚蠢。
    • 正如我所怀疑的......字符串到数字的隐式数据转换。 (问题中没有足够的信息来实际诊断问题,但这是我的猜测。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2017-04-22
    • 2019-01-17
    • 2012-09-04
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多