mysql - 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;
那么为什么当我使用变量时,它只更新第一行呢?
解决方案
该变量@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
更新子句后面的子查询被包装了两次,以避免尝试引用正在更新的同一个表的问题。这个技巧实际上实现了子查询,使其独立于更新期间发生的事情。
推荐阅读
- javascript - 布尔值未在 sessionStorage 中正确保存
- c# - Entity Framework Core 5:保存使用 Add(oldItem) 和 db.Entry(oldItem).State = EntityState.Modified 的区别?
- django - Django admin:每个应用都有不同的自定义 base_site.html
- html - HTML,对齐文件浏览器和提交按钮
- python - 模板中未显示帖子视图数(基于函数的视图)
- git - 如何重新定位到其他分支?
- javascript - “expo start”或“npm start”命令卡在“正在启动 Metro bundler”
- python - 如何在 python 文件中设置小部件的 ID?
- android - 如何使用 BottomNavigationBar 返回到 Android 中的最后一个片段
- swift - 快速强制转换为字符串