mysql存储过程使用on duplicate key update无法正常update

1、问题如标题所示;
2、情况:
a、创建了存储过程testPro
BEGIN

insert INTO test (uid,kNum,mNum) VALUES (`uid`,`kNum`,`mNum`)

ON DUPLICATE KEY UPDATE uid=`uid`,kNum=kNum+`kNum`,mNum=mNum+`mNum`;

END
输入参数为
IN `uid` varchar(10),IN `kNum` int,IN `mNum` int

b、构建表:
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`kNum` int(11) DEFAULT NULL,
`mNum` int(11) DEFAULT NULL,
`uid` varchar(10) NOT NULL,
PRIMARY KEY (`id`,`uid`),
UNIQUE KEY `ske` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

c、执行调用:
call testPro('2017-11-24',0,1);
第一次调用结果:

clipboard.png

第二次调用结果:

clipboard.png

第三次调用时,就不会再累加了,结果如第二次调用一样;

但如果,我们此时累加kNum一次:
call testPro('2017-11-24',1,0);
结果会变成这样:

clipboard.png

而且同样不能再继续累加;

请各位看看这到底是什么问题。网上能找的我应该都找了,实在没能找到解释。最接近的也就这篇文章,但是试过没有效果:https://yq.aliyun.com/ziliao/...

阅读 3.7k
2 个回答

存储过程的变量名不要和字段名一致,你换成a,b,c再试试

我直接复制你的表结构,sql语句,执行没有问题,会多次累加。但是,你的sql有点问题,每次是按照数据库原有的值累加:kNum=kNum+kNum,mNum=mNum+mNum,并不是数据库里的值 加上新的值。
正确的sql是:
INSERT INTO test (uid,kNum,mNum) VALUES ('2012', 0, 1) ON DUPLICATE KEY UPDATE uid=uid,kNum=VALUES(kNum)+kNum,mNum=VALUES(mNum)+mNum;

即:kNum=VALUES(kNum)+kNum

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题