MySQL中基于ID匹配及条件从另一表更新表的问题
正确的MySQL关联更新语句实现
没问题,我来帮你搞定这个需求!根据你描述的规则,这里有两种符合MySQL语法的更新写法,都是基于pdb_id匹配的前提来更新005_my_cl的listing_type字段:
方法1:使用JOIN的更新写法(推荐,可读性更好)
这种写法是MySQL中关联更新的标准方式,逻辑清晰,不容易出错:
UPDATE 005_my_sc sc INNER JOIN 005_my_cl cl ON sc.pdb_id = cl.pdb_id SET cl.listing_type = CASE WHEN sc.listing_type = 'new' THEN 2 WHEN sc.listing_type = 'rent' THEN 1 WHEN sc.listing_type = 'sale' THEN 2 ELSE cl.listing_type -- 保留原字段值,避免未定义的类型导致错误更新 END;
方法2:沿用你开头的多表逗号分隔写法
如果你习惯用逗号分隔表的写法,也可以这样写,效果和上面完全一致:
UPDATE 005_my_sc sc, 005_my_cl cl SET cl.listing_type = CASE WHEN sc.listing_type = 'new' THEN 2 WHEN sc.listing_type = 'rent' THEN 1 WHEN sc.listing_type = 'sale' THEN 2 ELSE cl.listing_type END WHERE sc.pdb_id = cl.pdb_id; -- 必须加这个WHERE条件,否则会误更新表中所有行!
重要提示
在执行更新之前,强烈建议先跑下面的查询语句验证映射结果是否正确,避免误操作:
SELECT sc.pdb_id, sc.listing_type AS sc_table_type, cl.listing_type AS cl_original_type, CASE WHEN sc.listing_type = 'new' THEN 2 WHEN sc.listing_type = 'rent' THEN 1 WHEN sc.listing_type = 'sale' THEN 2 ELSE cl.listing_type END AS cl_expected_type FROM 005_my_sc sc JOIN 005_my_cl cl ON sc.pdb_id = cl.pdb_id;
这样你可以提前确认每个匹配的pdb_id对应的更新值是否完全符合你的要求,没问题再执行更新语句。
内容的提问来源于stack exchange,提问作者Hoàng Việt
相关产品推荐
相关产品推荐

