MySQL无需JOIN从其他表取数更新首行多列的更简洁写法
MySQL settings表数据迁移优化方案
你原有写法的问题是每个列都单独查询一次settings表,列数多的时候会重复执行多次查询,针对这个需求有两种更简洁高效的写法:
方案1:多表UPDATE关联(兼容所有MySQL主流版本)
这种写法一次性取出settings表的首行数据做关联,全程仅查询settings表1次:
UPDATE website_settings ws JOIN ( SELECT dark_mode_enabled, header_enabled, footer_enabled FROM settings ORDER BY id LIMIT 1 ) s SET ws.dark_mode_enabled = s.dark_mode_enabled, ws.header_enabled = s.header_enabled, ws.footer_enabled = s.footer_enabled LIMIT 1;
方案2:CTE写法(仅支持MySQL 8.0及以上版本)
可读性更好,逻辑更清晰,同样仅查询1次settings表:
WITH first_settings AS ( SELECT dark_mode_enabled, header_enabled, footer_enabled FROM settings ORDER BY id LIMIT 1 ) UPDATE website_settings ws, first_settings fs SET ws.dark_mode_enabled = fs.dark_mode_enabled, ws.header_enabled = fs.header_enabled, ws.footer_enabled = fs.footer_enabled LIMIT 1;
说明
- 两种方案都保留了
LIMIT 1约束,和你原有逻辑完全一致,只会更新website_settings表的首行,不会出现误改多行的问题 - 如果要在多个库批量执行,只需要切换到对应库执行语句,或者给表名加上库名前缀即可
- 当需要迁移的列数越多,优化后的写法性能优势越明显,避免了重复查询同一张表的开销
内容的提问来源于stack exchange,提问作者L457
相关产品推荐
相关产品推荐

