1.需求
将百万级以上的数据从A表迁移到B表里面,B表本来就存在的记录,就做更新操作,B表之前不存在的记录,就做插入操作
2.分析
首先,一般来说,有些人会在java代码里面实现,先将需要更新和插入的数据分别查询出来,再使用oracle的batchUpdate这个方法,一般来说,这个效率也是不错的,但是,由于oracle数据库的batchUpdate这个批量执行的方法是不会返回执行成功的条数的,由于无法知道执行的结果,风险不可预估,一般不会采取这种方法!如果要一条一条去执行,效率实在是太低.
既然batchUpdate行不通,那么有什么好办法呢?经过本人的一番百度,终于找到了一个方法,那就是使用merge into,直接在数据库解决问题.这种方法非常高效,而且执行过程中如果遇到失败,执行会终止,且会抛出错误.换句话说,不报错,即表示全部执行成功,提交事务即可生效.
3.实现
假如有A表,A表有FA1,FA2,FA3,FA4.....n个字段,F1为主键,有B表,B表有FB1,FB2,FB3,FB4...n个字段,FB1为主键,需要将A表的数据迁移到B表中
直接可以这么写
MERGE INTO B T1
USING (SELECT * FROM A ) T2 ON (T1.FB1 = T2.FA1 )
WHEN MATCHED THEN
UPDATE B SET T1.FB2= T2.FA2,T1.FB3= T2.FA3,T1.FB4=T2.FA4
WHEN NOT MATCHED THEN
INSERT(T1.FB1,T1.FB2,T1.FB3,T1.FB4) VALUES(T2.FA1,T2.FA2,T2.FA3,T2.FA4);
4.注意
1.更新时,主键不能更新
2.using 里面的那个查询语句是可以根据你的业务需求,添加where条件的,on里面的连接条件也是可以多个的,当主键是联合主键的时候,on里面可以写多个,用and连接