Неправильное использование UPDATE, REPEAT и LIMIT для хранимой процедуры в MySQL - PullRequest
1 голос
/ 20 марта 2019

В моей таблице MySQL у меня есть номер строки:

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

Теперь мне нужно обновить столбец doTableUO в таблице doTable , используя JOIN с таблицей doTableUser .

Я пробовал Хранимая процедура без успеха, потому что у меня есть эта ошибка:

Процедурасбой выполнения 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 голосов
/ 20 марта 2019

Из того, что я понял, вы просто хотите поместить один и тот же случай в 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

...