MySQL基于源表数据更新列名不同的目标表空字段方法
实现方案
首先先明确两个表的字段对应关系:
- 匹配键:两表的
Id为同一家公司的唯一标识,用来关联对应行 - 待更新字段映射:源表
Source.adress→ 目标表target.companyAdress
核心更新语句
UPDATE target t INNER JOIN Source s ON t.Id = s.Id SET t.companyAdress = s.adress WHERE t.companyAdress IS NULL OR t.companyAdress = '';
语句逐行解释
UPDATE target t:指定要修改的表是target,并给它起别名t简化后续书写INNER JOIN Source s ON t.Id = s.Id:将目标表和源表按Id关联,把两张表同Id的行拼接匹配,源表别名设置为sSET t.companyAdress = s.adress:指定更新规则,把目标表的companyAdress字段替换为源表同Id行的adress值,这里直接写两边的对应字段名即可,不需要两边字段名相同WHERE t.companyAdress IS NULL OR t.companyAdress = '':过滤条件,只更新目标表中地址为空的行,已经填了数据的行不会被修改,符合只补缺失值的需求
注意事项
- 如果你担心
Id有错位的情况,可以在关联条件里增加公司名匹配规则,关联部分修改为:
双重校验可以避免匹配错误ON t.Id = s.Id AND t.nameCompany = s.companyName - 建议更新前先运行查询语句确认要更新的内容是否正确,避免误改数据,验证SQL如下:
SELECT t.Id, t.nameCompany, t.companyAdress AS 目标表原有地址, s.adress AS 源表待填充地址 FROM target t INNER JOIN Source s ON t.Id = s.Id WHERE t.companyAdress IS NULL OR t.companyAdress = ''; - 如果后续需要同步更多字段,直接在
SET后追加对应映射关系即可,比如要同步公司名就写为:SET t.companyAdress = s.adress, t.nameCompany = s.companyName
内容的提问来源于stack exchange,提问作者AquatixzzZ
相关产品推荐
相关产品推荐

