MySQL: обновление таблицы с IN (@variable) не удалось - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь обновить таблицу с помощью функции IN и переменной.

Содержимое переменной представляет собой подзапрос, который возвращает ожидаемые значения или идентификатор для каждой строки. Когда я копирую / вставляю значения в обновлении, все нормально.

USE `DB1`;

SET SQL_SAFE_UPDATES = 0;

SET @VAR1 = "STRING1,STRING2,STRING3,STRING4";
SET @VAR2 = (SELECT GROUP_CONCAT(`id`) FROM `tbl_A` WHERE FIND_IN_SET(`description`, @VAR1) AND `fieldtype` = '');

UPDATE `tbl_A`
SET `idaccount` = 2
WHERE `id` IN (@VAR2);

SET SQL_SAFE_UPDATES = 1;

Так почему, когда я использую переменную, она обновляет только первую строку?

1 Ответ

2 голосов
/ 19 июня 2019

Переменная @VAR2 является скалярной переменной и не может хранить набор результатов.Для этого вам потребуется табличная переменная, которую MySQL не поддерживает напрямую (обратите внимание, что другие базы данных, такие как SQL Server, поддерживают их).

Но вы можете встроить подзапрос, и он должен работать:

SET @VAR1 = "STRING1,STRING2,STRING3,STRING4";

UPDATE tbl_A
SET idaccount = 2
WHERE id IN (SELECT id FROM (
                 SELECT id FROM tbl_A
                 WHERE FIND_IN_SET(description, @VAR1) AND fieldtype = ''
             )x );

Обратите внимание, что подзапрос, следующий за предложением IN обновления, переносится дважды, чтобы избежать проблемы обращения к той же таблице, которая обновляется.Этот трюк фактически материализует подзапрос, оставляя его независимым от того, что происходит во время обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...