You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

宽表转键值对长表后无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:09:02