首页 > 解决方案 > MySQL:使用 IN (@variable) 更新表失败

问题描述

我正在尝试使用 IN 函数和变量更新表。

变量的内容是一个子查询,它返回每个字符串的预期值(即 ID)。当我复制/粘贴更新中的值时,一切都很好。

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;

那么为什么当我使用变量时,它只更新第一行呢?

标签: mysqlsql-updateuser-variables

解决方案


该变量@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更新子句后面的子查询被包装了两次,以避免尝试引用正在更新的同一个表的问题。这个技巧实际上实现了子查询,使其独立于更新期间发生的事情。


推荐阅读