如何为vehicle表新增的is_default字段批量回填历史数据
解决Vehicle表is_default字段的填充问题
你的SQL逻辑存在漏洞:子查询仅过滤了单条记录的is_default=0,但没有排除那些已经存在is_default=1记录的model。哪怕某个model已经有默认颜色,只要它还有is_default=0的记录,子查询就会选中该model的MIN(id),进而执行UPDATE操作,导致该model出现多个is_default=1的记录,违反了规则2。
要满足你的需求,必须先筛选出完全没有默认颜色的model,再对这类model指定一条记录设为默认。以下是两种可行的写法:
方法一:使用NOT EXISTS筛选无默认值的model
UPDATE vehicle AS scl JOIN ( SELECT model, MIN(id) AS min_id FROM vehicle WHERE NOT EXISTS ( SELECT 1 FROM vehicle AS sub WHERE sub.model = vehicle.model AND sub.is_default = 1 ) GROUP BY model ) AS sc ON scl.model = sc.model AND scl.id = sc.min_id SET scl.is_default = 1;
方法二:使用LEFT JOIN筛选无默认值的model
UPDATE vehicle AS scl JOIN ( SELECT v.model, MIN(v.id) AS min_id FROM vehicle v LEFT JOIN vehicle v_default ON v.model = v_default.model AND v_default.is_default = 1 WHERE v_default.id IS NULL GROUP BY v.model ) AS sc ON scl.model = sc.model AND scl.id = sc.min_id SET scl.is_default = 1;
这两种写法的核心逻辑一致:先排除所有已有is_default=1记录的model,仅对完全没有默认颜色的model,选取其id最小的记录将is_default设为1,完美符合你提出的两条规则。
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

