如何用MariaDB/MySQL实现两个数据库的缺失数据填充合并?
完全用MariaDB/MySQL实现数据库缺失数据补全的方案
当然可以,而且用单条SQL语句就能完成,比你原本的逐行循环方式效率高得多。核心思路是利用跨库UPDATE JOIN,一次性完成所有符合条件的记录更新,不需要写循环逻辑。
前提条件
确保db1和db2处于同一个数据库实例中;如果不在同一实例,可先将db2的数据导入到当前实例,或使用MariaDB的CONNECT引擎/MySQL的FEDERATED引擎实现远程表访问。
基础实现SQL
直接通过多表关联完成更新,逻辑和你伪代码完全对应:
UPDATE db1.taxon_Plantae tp INNER JOIN db2.longnames ln ON tp.nomen = ln.completename INNER JOIN db2.vernaculars v ON ln.tsn = v.tsn SET tp.nomen_en = v.vernacular_name WHERE tp.nomen_en IS NULL AND v.language = 'english';
处理多匹配结果的情况
如果db2中同一个completename对应多条英文俗名,可通过子查询+窗口函数确保只取第一条匹配结果,避免重复更新:
UPDATE db1.taxon_Plantae tp INNER JOIN ( SELECT completename, vernacular_name FROM ( SELECT ln.completename, v.vernacular_name, ROW_NUMBER() OVER (PARTITION BY ln.completename ORDER BY v.vernacular_name) rn FROM db2.longnames ln INNER JOIN db2.vernaculars v ON ln.tsn = v.tsn WHERE v.language = 'english' ) sub_query WHERE rn = 1 ) db2_matched_data ON tp.nomen = db2_matched_data.completename SET tp.nomen_en = db2_matched_data.vernacular_name WHERE tp.nomen_en IS NULL;
逻辑说明
这条SQL会:
- 筛选出db1中
nomen_en为空的所有植物记录 - 关联db2的
longnames和vernaculars表,找到对应的英文俗名 - 批量更新db1的
nomen_en字段,一次性完成所有符合条件的补全操作
内容的提问来源于stack exchange,提问作者user1747036
相关产品推荐
相关产品推荐

