MySQL中存储过程的UPDATE,REPEAT和LIMIT使用不正确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中存储过程的UPDATE,REPEAT和LIMIT使用不正确相关的知识,希望对你有一定的参考价值。
在我的mysql表中,我有这个行数:
mysql> SELECT
COUNT(*) AS nrRow
FROM
`doTable`;
+--------+
| nrRow |
+--------+
| 334529 |
+--------+
1 row in set
现在我需要使用表doTableUser的JOIN更新表doTable上的列doTableUO。
我试过这个存储过程没有成功,因为我有这个错误:
过程执行失败1221 - UPDATE和LIMIT的使用不正确
我认为使用LIM使用LIMIT语法可以避免服务器过载。
如果在正常查询中执行SQL代码,我有这个输出:
[错误] 2013 - 查询期间与MySQL服务器的连接丢失
我怎么能解决这个问题。
我的代码如下。
BEGIN
REPEAT
UPDATE `doTable` jjj
JOIN (
SELECT
`doTableUOUser`
FROM
`doTableUser`
GROUP BY
`doTableUOUser`
) AS kkk
SET jjj.doTableUO = kkk.doTableUOUser
WHERE
jjj.doTableUO IS NULL
AND UPPER(jjj.doTableUO) = UPPER(
kkk.doTableUOUser
) LIMIT 10000;
UNTIL ROW_COUNT() = 0 END REPEAT;
END
编辑#1
简单的SQL查询:
UPDATE `doTable` jjj
JOIN (
SELECT
`doTableUOUser`
FROM
`doTableUser`
GROUP BY
`doTableUOUser`
) AS kkk
SET jjj.doTableUO = kkk.doTableUOUser
WHERE
jjj.doTableUO IS NULL
AND UPPER(jjj.doTableUO) = UPPER(
kkk.doTableUOUser
);
Schema doTable
:
CREATE TABLE `doTable` (
`doTableUO` varchar(255) DEFAULT NULL,
KEY `doTableUO` (`doTableUO`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Schema doTableUser
:
CREATE TABLE `doTableUser` (
`doTableUOUser` varchar(255) DEFAULT NULL,
`doTableUOUserNumber` int(11) DEFAULT NULL,
KEY `doTableUOUser` (`doTableUOUser`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
答案
根据我的理解,你只想在2个表格中加入相同的案例。
您可以在一个查询中执行此操作:
UPDATE `doTable` dT
INNER JOIN `doTableUser` dTU
ON COALESCE(UPPER(dT.doTableUO),'') = COALESCE(UPPER(dTU.doTableUOUser),'')
SET dT.doTableUO = dTU.doTableUOUser
WHERE dt.doTableUO IS NOT NULL;
有关COALESCE的更多信息
以上是关于MySQL中存储过程的UPDATE,REPEAT和LIMIT使用不正确的主要内容,如果未能解决你的问题,请参考以下文章