MySQL 8如何遍历查询结果集并同步完成对应表的更新操作
问题原因
你写的语句无法运行主要有两个原因:
- SQL执行顺序中,
WHERE子句的执行优先级高于SELECT子句,所以你在SELECT里定义的别名SKU无法直接在同层级的WHERE中引用 - 单纯的
SELECT查询无法直接修改表B的数据,要更新字段需要用UPDATE语法
可运行的查询版本
如果只是要查询未匹配SKU的记录,把WHERE换成HAVING即可:
SELECT a.TITLE, a.URL, ( SELECT mp.SKU FROM my_products mp WHERE MATCH (mp.NAME, mp.QUANTITY) AGAINST (a.TITLE) LIMIT 1 ) AS SKU FROM amazon_products a HAVING SKU IS NULL;
表B更新方案
步骤1:新增SKU存储字段
首先给表B(amazon_products)新增用于存储匹配结果的SKU字段,字段类型和表A(my_products)的SKU字段保持一致:
ALTER TABLE amazon_products ADD COLUMN SKU VARCHAR(50) NULL COMMENT '匹配到的商品SKU';
步骤2:执行匹配更新
推荐使用关联子查询的方式更新,写法简单兼容性好:
UPDATE amazon_products a SET a.SKU = ( SELECT mp.SKU FROM my_products mp WHERE MATCH (mp.NAME, mp.QUANTITY) AGAINST (a.TITLE) LIMIT 1 ) WHERE a.SKU IS NULL;
注意事项
- 请确保
my_products表的NAME和QUANTITY字段已经创建了联合全文索引,否则匹配效率会非常低 - 全文搜索默认有最小匹配长度限制(MySQL InnoDB默认是4字符),过短的标题可能无法正常匹配,可根据需求调整数据库参数
- 如果需要更精准的匹配,可以给
AGAINST加上IN BOOLEAN MODE参数调整匹配规则
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

