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

编辑#2 enter image description here

编辑#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使用不正确的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储过程中的3种循环

mysql 存储过程 与 循环

Java学习总结(十八)——MySQL数据库MySQL数据库中的视图,函数,存储过程中常见循环

mysql 存储过程中update影响行数为0,回滚

MySQL:存储过程语法错误

MySQL-07-笔记