MySQL新手求助:基于城市名和国家码匹配并插入数据
解决MySQL基于城市+国家码匹配插入的问题
嘿,作为MySQL新手碰到这种批量匹配插入的需求太常见了,我来给你一步步讲清楚怎么实现你要的效果~
首先先明确一下咱们的表结构(我先假设表名,你可以换成自己实际的表名):
- 表1(假设叫
city_reference):字段是city(城市名)、country_code(国家码) - 表2(假设叫
target_cities):字段是number(自增主键)、city、country_code
核心实现方法:INSERT ... SELECT 结合 NOT EXISTS
这个方法逻辑很直观——从表1里筛选出表2中不存在的(城市+国家码)组合,然后插入到表2中。代码如下:
INSERT INTO target_cities (city, country_code) SELECT cr.city, cr.country_code FROM city_reference cr WHERE NOT EXISTS ( SELECT 1 FROM target_cities tc WHERE tc.city = cr.city AND tc.country_code = cr.country_code );
代码解释:
INSERT INTO target_cities (city, country_code):因为number是自增字段,MySQL会自动生成,所以我们只需要指定要插入的城市和国家码字段SELECT cr.city, cr.country_code FROM city_reference cr:从参考表(表1)中取出所有需要匹配的城市数据WHERE NOT EXISTS (...):判断当前这条(城市+国家码)在目标表(表2)中是否不存在,不存在才会被选中插入
另一种方法:LEFT JOIN 筛选不存在的记录
如果你更喜欢用JOIN的方式,也可以这么写,效果是一样的:
INSERT INTO target_cities (city, country_code) SELECT cr.city, cr.country_code FROM city_reference cr LEFT JOIN target_cities tc ON cr.city = tc.city AND cr.country_code = tc.country_code WHERE tc.number IS NULL;
这里通过左连接后筛选出表2中没有匹配到的记录(也就是tc.number为NULL的那些),然后插入。
额外提醒:避免重复插入的保险措施
为了防止以后不小心重复执行插入语句导致数据重复,建议给表2的city和country_code加一个联合唯一索引:
ALTER TABLE target_cities ADD UNIQUE INDEX idx_city_country (city, country_code);
这样即使重复执行插入语句,MySQL也会自动忽略重复的记录(如果用INSERT IGNORE的话),或者直接报错提醒你,避免数据冗余。
执行完上面的插入语句后,你查询target_cities就能看到新增的两条记录:(4, Paris, FR)和(5, Shanghai, CN)啦~
内容的提问来源于stack exchange,提问作者D. Make
相关产品推荐
相关产品推荐

