本文整理自网络,侵删。
目录
- 部分覆盖
- 业务场景
- 应用方案
- 完全覆盖
- 业务场景
- 应用方案
- 总结
众所周知,数据库中INSERT INTO语法是append方式的插入,而最近在处理一些客户数据导入场景时,经常遇到需要覆盖式导入的情况
常见的覆盖式导入主要有下面两种:
1、部分覆盖:新老数据根据关键列值匹配,能匹配上则使用新数据覆盖,匹配不上则直接插入。
2、完全覆盖:直接删除所有老数据,插入新数据。
本文主要介绍如何在数据库中完成覆盖式数据导入的方法。
部分覆盖
业务场景
某业务每天给业务表中导入大数据进行分析,业务表中某列存在主键,当插入数据和已有数据存在主键冲突时,希望能够对该行数据使用新数据覆盖或者说更新,而当新老数据userid不冲突的情况下,直接将新数据插入到数据库中。以将表src中的数据覆盖式导入业务表des中为例:
应用方案
方案一:使用DELETE+INSERT组合实现(UPDATE也可以,请读者思考)
--开启事务 START TRANSACTION; --去除主键冲突数据 DELETE FROM des USING src WHERE EXISTS (SELECT 1 FROM des WHERE des.userid = src.userid); --导入新数据 INSERT INTO des SELECT * FROM src WHERE NOT EXISTS (SELECT 1 FROM des WHERE des.userid = src.userid); --事务提交 COMMIT;
方案优点:使用最常见的使用DELETE和INSERT即可实现。
方案缺点:1、分了DELETE和INSERT两个步骤,易用性欠缺;2、借助子查询识重,DELETE/INSERT性能受查询性能制约。
方案二:使用MERGE INTO功能实现
MERGE INTO des USING src ON (des.userid = src.userid) WHEN MATCHED THEN UPDATE SET des.b = src.b WHEN NOT MATCHED THEN INSERT VALUES (src.userid,src.b);
方案优点:MERGE INTO单SQL搞定,使用便捷,内部去重效率高。
相关阅读 >>
解决 sql 问题绝对能让你对 mysql 的理解更进一步!
mysql中utf8_unicode_ci、utf8_general_ci有什么区别?
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » mysql中数据库覆盖导入的几种方式总结
标签:mysql
相关推荐
评论
管理员已关闭评论功能...