gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:36:33 25 4
gpt4 key购买 nike

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

最佳答案

不清楚“始终为零”是什么意思?

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

为了进行调试,请考虑将这些值保存在用户定义的变量中(以便您可以在触发器触发后从同一 session 查询变量)。

或者考虑将值添加到描述消息中,

CONCAT(...,' ow=',IFNULL(OLD.weight,'NULL'),' nw=',IFNULL(NEW.weight,'NULL'))

关于Mysql 触发器在变量中串联不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50238981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com