众所周知,数据库中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搞定,使用便捷,内部去重效率高。

方案缺点:需要数据库产品支持MERGE INTO功能,当前Oracle、GaussDB(DWS)等数据库已支持此功能,mysql的insert into on duplicate key也类似此功能。

完全覆盖

业务场景

某业务每天给业务表中导入一定时间区间的数据进行分析,分析只需要导入时间区间的去除,不需要以往历史数据,这种情况就需要使用到覆盖式导入。

应用方案

方案一:使用TRUNCATE+INSERT组合实现

--开启事务
START TRANSACTION;--清除业务表数据
TRUNCATE des;--插入1月份数据
INSERT INTO des SELECT * FROM src WHERE time > '2020-01-01 00:00:00' AND time < '2020-02-01 00:00:00';--提交事务
COMMIT;

方案优点:简单暴力,先清理在插入直接实现类似覆盖写功能。

方案缺点:TRUNCATE清理业务表des数据时对表加8级锁直到事务结束,在因数据量巨大而INSERT时间很长的情况下,des表在很长时间内是不可访问的状态,业务表des相关的业务处于中断状态。

方案二:使用创建临时表过渡的方式实现

--开启事务
START TRANSACTION;--创建临时表
CREATE TABLE temp(LIKE desc INCLUDING ALL);--数据先导入到临时表中
INSERT INTO temp SELECT * FROM src WHERE TIME > '2020-01-01 00:00:00' AND TIME < '2020-02-01 00:00:00';--导入完成后删除业务表des
DROP TABLE des;--修改临时表名temp->des
ALTER TABLE temp RENAME TO des;--提交事务
COMMIT;

方案优点:相比方案一,在INSERT期间,业务表des可以继续被访问(老数据),即事务提交前分析业务可继续访问老数据,事务提交后分析业务可以访问新导入的数据。

方案缺点:1、组合步骤较多,不易用;2、DROP TABLE操作会删除表的依赖对象,例如视图等,后面依赖对象的还原可能会比较复杂。

方案三:使用INSERT OVERWRITE功能

INSERT OVERWRITE INTO des SELECT * FROM src WHERE time > '2020-01-01 00:00:00' AND time < '2020-02-01 00:00:00';

方案优点:单条SQL搞定,执行便捷,能够支持一键式切换业务查询的新老数据,业务不中断。

方案缺点:需要产品支持INSERT OVERWRITE功能,当前impala、GaussDB(DWS)等数据库均已支持此功能。

总结

随着大数据的场景越来越多,数据导入的场景也越来越丰富,除了本文介绍的覆盖式数据导入,还有其他诸如忽略冲突的INSERT IGNORE导入等等其他的导入方式,这些导入场景可以以使用基础的INSERT、UPDATE、DELETE、TRUNCATE来组合实现,但是也同样会对高级的一键SQL功能有直接诉求,后面有机会再叙述。

mysql中数据库覆盖导入的几种方式相关推荐

  1. c# mysql连接字符串_c#中数据库字符串的连接几种方式

    ADO.net 中数据库连接方式(微软提供) 微软提供了以下四种数据库连接方式: System.Data.OleDb.OleDbConnection System.Data.SqlClient.Sql ...

  2. 【MySQL】MySQL 查看数据库表列表的3种方式

    1.概述 show tables; show tables in web;show tables from `web`; 数据库如果带有中划线,记得加上反引号

  3. mysql中如何进行模糊搜索的几种方式

    一.使用%代替零个或多个字符 %可匹配任意类型和长度的字符,有些情况下若是中文,可能需要使用两个%%表示 1.1 "%xx%" 使用方式: like '%XXX%' 使用案例: S ...

  4. c语言中按照“|”字符串截取,shell中取字符串子串的几种方式 截取substr

    echo "123456789" | awk '{print substr($0,5,2)}' 截取 1)awk中函数substr substr(源字符串,开始索引,长度)   开 ...

  5. mysql修改表名几种方式_Oracle数据库中修改表名的几种方式

    Oracle数据库中修改表名的几种方式如下:answer1: ALTER TABLE old_table_name RENAME TO new_table_name;(大写为系统命令)answer2: ...

  6. mysql数据库主从不同步_MySQL数据库之mysql主从数据库不同步的2种解决方法

    本文主要向大家介绍了MySQL数据库之mysql主从数据库不同步的2种解决方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 今天发现Mysql的主从数据库没有同步 先上Mas ...

  7. mysql中数据库字段类型详解

    mysql中数据库字段类型详解 1,blob字段 mysql中blob是一个二进制大型对象,是一个可以储存大量数据的容器,它能容纳不同大小的数据. mysql中blob的四种类型除了存储数据的大小有区 ...

  8. mysql数据库删除数据的三种方式:

    mysql数据库删除数据的三种方式: delete from table where 直接删除表中的某一行数据,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.所以delete相 ...

  9. MySQL中数据库的操作

    文章目录 1 MySQL中数据库的操作 1.1 创建数据库 1.2 查看数据库 1.3 选择数据库 1.4 删除数据库 1.5 数据库的命名规范 1 MySQL中数据库的操作 像文件一样,我们可以随时 ...

最新文章

  1. Dell PowerVault TL4000 磁带机卡带问题
  2. 局域网共享文件夹设置
  3. CVE-2014-7911 Android本地提权漏洞分析与利用
  4. makefile文件中的依赖关系理解
  5. [解决]电信彩信网关开发错误-SOAP_VERSIONMISMATCH
  6. ORACLE 11G负载均衡测试
  7. 做好前端的话HTML和CSS基础必须夯实!
  8. java quartz 触发_JavaEE进阶知识学习-----定时任务调度Quartz-2-触发器Trigger
  9. 磁盘空间未释放异常案例
  10. NDTTS-II变压器综合试验系统
  11. 用这几款软件轻松自动识别图片文字,快码住
  12. vue3.0引入element插件报错解决
  13. python实现最小二乘法进行线性拟合
  14. [luogu4234]最小差值生成树
  15. jpeg图片太大怎么办?一分钟轻松搞定
  16. java操作excel方法_Java实现操作excel表格的方法
  17. flask android app socketio加解密 匿名加密聊天室 不被任何官方非官方机构个人监视的匿名聊天室!!! 想聊什么就聊什么!
  18. 手机是如何泄密个人隐私的
  19. Excel表格怎么转PDF?这两种途径都可以
  20. 实现Python3.7下从Tushare库的LPR贷款基础利率接口获取实时数据

热门文章

  1. 路径总和Python解法
  2. python整体缩进笔记_python笔记1
  3. Spark On Yarn 运行模式(详细)
  4. Hadoop——分布式资源管理框架YARN总结
  5. php+如何按文字分割文件夹,PHP实现的大文件切割与合并功能示例
  6. mysql relay log时间_如何得到Slave应用relay-log的时间
  7. android studio新建layout,【Android Studio安装部署系列】十六、Android studio在layout目录下新建子目录...
  8. java开发环境安装原理,java开发环境搭建 java开发环境的完整搭建过程
  9. Ubantu18.04安装Vivado
  10. 在java中关于枚举类型的特性_java枚举类型小结