在MySQL中对存储过程的UPDATE,REPEAT和LIMIT使用不正确

时间:2019-03-20 09:33:05

标签: mysql stored-procedures sql-update limit repeat

在我的MySQL表中,我有以下行数:

mysql> SELECT
    COUNT(*) AS nrRow
FROM
    `doTable`;
+--------+
| nrRow  |
+--------+
| 334529 |
+--------+
1 row in set

现在,我需要使用 JOIN 和表 doTableUser 来更新表 doTable 上的列 doTableUO

我尝试了此存储过程,但没有成功,因为我遇到此错误:

  

程序执行失败1221-错误使用UPDATE和LIMIT

我认为使用 SP LIMIT 语法可以避免服务器过载。

如果在普通查询中执行SQL代码,我会遇到以下问题:

  

[Err] 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
);

模式doTable

CREATE TABLE `doTable` (
  `doTableUO` varchar(255) DEFAULT NULL,
  KEY `doTableUO` (`doTableUO`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

模式doTableUser

CREATE TABLE `doTableUser` (
  `doTableUOUser` varchar(255) DEFAULT NULL,
  `doTableUOUserNumber` int(11) DEFAULT NULL,
  KEY `doTableUOUser` (`doTableUOUser`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

1 个答案:

答案 0 :(得分:0)

据我了解,您只想在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

的更多信息