宽表转键值对长表后无需SELECT更新同ID下A、B相等两行的实现方法
问题解答
结论
可以实现无需提前执行独立SELECT的更新操作,也可借助INSERT ... ON DUPLICATE KEY UPDATE语法实现需求,仅需提前将长表的(ID, type)设置为联合唯一主键即可。
方案1:单条UPDATE语句实现(性能最优,推荐测试使用)
直接通过自关联匹配同ID下的A、B两条记录,仅当两者值相等时触发更新,全程无需单独执行SELECT查询:
UPDATE 长表名 t1 INNER JOIN 长表名 t2 ON t1.ID = t2.ID AND t1.type = 'A' AND t2.type = 'B' AND t1.value = t2.value SET t1.value = 你的A字段新值, t2.value = 你的B字段新值 WHERE t1.ID = '指定的目标ID';
方案2:借助INSERT ... ON DUPLICATE KEY UPDATE实现(兼容A/B记录不存在的场景)
如果需要覆盖目标ID没有A/B对应记录的场景(不存在则自动插入,存在则判断等值后更新),可以用以下写法,为了避免MySQL同表更新报错对子查询做了嵌套处理,符合测试场景接受非最佳实践的要求:
INSERT INTO 长表名 (ID, type, value) VALUES ('指定的目标ID', 'A', 你的A字段新值), ('指定的目标ID', 'B', 你的B字段新值) ON DUPLICATE KEY UPDATE value = IF( (SELECT value FROM (SELECT * FROM 长表名 WHERE ID = '指定的目标ID' AND type = 'A') AS tmp_a) = (SELECT value FROM (SELECT * FROM 长表名 WHERE ID = '指定的目标ID' AND type = 'B') AS tmp_b), VALUES(value), value );
补充说明
两种方案的所有判断逻辑都封装在单条SQL中,应用侧不需要提前执行SELECT查询拉取数据判断条件,完全匹配需求。
内容的提问来源于stack exchange,提问作者loonukir
相关产品推荐
相关产品推荐

