select中的Mysql错误嵌套算法

select中的Mysql错误嵌套算法,mysql,select,arithmetic-expressions,Mysql,Select,Arithmetic Expressions,当我试图执行这个过程时,它显示了一个错误 USE `metro`; DROP procedure IF EXISTS `transaction`; DELIMITER $$ USE `metro`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `transaction`( IN amount_p INT, IN id_in INT, IN id_out INT, IN uidd INT ) BEGIN DECLARE uide INT; DECL

当我试图执行这个过程时,它显示了一个错误

USE `metro`;
DROP procedure IF EXISTS `transaction`;

DELIMITER $$
USE `metro`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `transaction`(
IN amount_p INT,
IN id_in INT,
IN id_out INT,
IN uidd INT
)
BEGIN

DECLARE uide INT;
DECLARE amt INT;
DECLARE NOW_AMT INT DEFAULT 0;

SELECT `amount` INTO amt FROM metro.wallet WHERE `uid`=uide;
INSERT INTO metro.transactions(`amount_deducted`,`time`,`station_id_in`,`station_id_out`,`uid`)
VALUES (amount_p,now(),id_in,id_out,uid);
SELECT uidd INTO uide;
SELECT uide;
SET NOW_AMT:=@amt+amount_p;

SELECT amt;
UPDATE metro.wallet SET `uid`=uide,`amount`=NOW_AMT;

END$$

DELIMITER ;
wallet是一个带有uid和amount列的表

错误代码1048,SQL状态23000:列“金额”不能为空 第1行第1列

0秒后执行完成,出现1个错误

执行:

call metro.transaction(112,1,1,1);

也许可以将您的金额包装在case语句中,如果它为NULL,您可以返回默认值

SELECT case when `amount` is NULL then '' else `amount` END as `amount` INTO amt FROM metro.wallet WHERE `uid`=uide;

一个猜测是
SET NOW\u AMT:=@AMT+amount\p,则“@amt”引用的是用户变量,而不是store proc variableOnly Update命令无法在@DBugyes处执行。如果我的怀疑是正确的,@amt为null,那么这将使NOW_amt为null,因此当您尝试使用NOW_amt更新amount列时,它为null,因此更新失败。如果我这样做,…更新metro.wallet SET
uid
=uide,
amount
=amount\p;。。。当我尝试更新metro.wallet SET
uid
=uide,
amount
=amt;。。。。。。它说列amount不能为null…..我希望这能帮助你理解我的问题是的你是对的@DBug'amt'为null如果我这样做…..更新metro.wallet SET
uid
=uide,
amount
=amount\u p;。。。当我尝试更新metro.wallet SET
uid
=uide,
amount
=amt;。。。。。。它说列金额不能为空…我希望这能帮助你理解我的问题