我是靠谱客的博主 虚拟面包,最近开发中收集的这篇文章主要介绍MySql的存储过程只能更新一条记录的问题解决问题解决办法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题

最近数据库里有几千条数据要批量更新,每条记录更新的算法还不太一样,于是想着在Navicat里运行MySql的存储过程好了,原本以为的一个小函数,不小心调试了一天。

主要的问题是存储过程运行之后数据就只更新了一条,晕,这比手动更新慢多了。
下面是我原来的代码:

BEGIN
	DECLARE s_id INT;
	DECLARE s_birth DATE;
	DECLARE s_identity VARCHAR(255);
	DECLARE loop_count INT;
	DECLARE done_id INT;

	DECLARE cursor_item CURSOR FOR SELECT id, identity_id, FROM student WHERE birthday is NULL;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_id = 1;

	set loop_count = 0;
	set s_birth = NULL;

	OPEN cursor_item;
	cursor_loop_shop:LOOP
		FETCH cursor_item INTO s_id, s_identity;
		SET loop_count = loop_count + 1;

    IF s_identity IS NOT NULL THEN
		set s_birth = STR_TO_DATE(SUBSTRING(s_identity, 7, 8),'%Y%m%d');
	END IF;

	 IF s_birth is NOT NULL THEN
		UPDATE student s SET s.birthday = s_birth WHERE s.id = s_id;
	 END IF;

     IF done_id = 1 THEN
        LEAVE cursor_loop_shop;
     END IF;
	END LOOP cursor_loop_shop;
	CLOSE cursor_item;

	SELECT loop_count, done_id;
END

尝试了N种方法均告失败,执行存储过程死活每次就都只更新一条记录。最终查了下英文资料,才得到如何绕过的提示。

解决办法

最后的解决办法是把其中Update的那一句话,放到一个新的存储过程中,

BEGIN
 IF s_birth is NOT NULL THEN
	UPDATE student s SET s.birthday = s_birth WHERE s.id = s_id;
 END IF;
END

在原来的代码中,改成调用存储过程的方式来调用就可以了。

	 IF s_birth is NOT NULL THEN
		call updatebirth(s_id, s_birth);
	 END IF;

执行起来速度完全没有影响,几千条记录也就一两秒就完成了。咳,也不清楚是Navicat的Bug还是MySQL的bug,希望能给其它人以帮助。

最后

以上就是虚拟面包为你收集整理的MySql的存储过程只能更新一条记录的问题解决问题解决办法的全部内容,希望文章能够帮你解决MySql的存储过程只能更新一条记录的问题解决问题解决办法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部