教你两种数据库覆盖式数据导入方法

摘要:本文主要介绍如何在数据库中完成覆盖式数据导入的方法。

前言

众所周知,数据库中INSERT INTO语法是append方式的插入,而最近在处理一些客户数据导入场景时,常常遇到须要覆盖式导入的状况,常见的覆盖式导入主要有下面两种:mysql

一、部分覆盖:新老数据根据关键列值匹配,能匹配上则使用新数据覆盖,匹配不上则直接插入。sql

二、彻底覆盖:直接删除全部老数据,插入新数据。数据库

本文主要介绍如何在数据库中完成覆盖式数据导入的方法。app

部分覆盖

业务场景

某业务天天给业务表中导入大数据进行分析,业务表中某列存在主键,当插入数据和已有数据存在主键冲突时,但愿可以对该行数据使用新数据覆盖或者说更新,而当新老数据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便可实现。大数据

方案缺点:一、分了DELETE和INSERT两个步骤,易用性欠缺;二、借助子查询识重,DELETE/INSERT性能受查询性能制约。url

方案二:使用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搞定,使用便捷,内部去重效率高。spa

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

彻底覆盖

业务场景

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

应用方案

方案一:使用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能够继续被访问(老数据),即事务提交前分析业务可继续访问老数据,事务提交后分析业务能够访问新导入的数据。

方案缺点:一、组合步骤较多,不易用;二、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功能有直接诉求,后面有机会再继续介绍。

本文分享自华为云社区《数据库覆盖式数据导入方法介绍》,原文做者:along_2020 。

 

点击关注,第一时间了解华为云新鲜技术~

相关文章
相关标签/搜索