当我们做程序开发时,难免会用到复杂的存储手段,本章就讲解其中一种:对目标表插入或更新数据,即:通过主键判断目标表是否有相匹配数据,若存在则更新,若不存在则插入,下面通过例子来详细介绍。
一、首先创建两张表,表结构不需要一致,主键字段也不需要相同。
Create Table mtable (
id Varchar2(5) Primary Key,
count Varchar2(5),
remark Varchar2(10));
Create Table ntable (
id Varchar2(5),
count Varchar2(5),
remark Varchar2(10),
notcie Varchar2(100));
alter table NTABLE add primary key (ID, COUNT);
二、给两张表插入测试数据大家可以Get一下该方法,可以很方便的插入大批量数据,用于平时学习测试等。
Declare
i number;
Begin
--向mtable中插入5条数据
for i in 1..5 loop
insert Into mtable Values (i,lpad(i,2,0), 'mTable');
end loop;
--向mtable中插入5条数据,用于验证无法关联的数据是不会变更的
for i in 11..15 loop
insert Into mtable Values (i,lpad(i,2,0),'mTable');
end loop;
--向ntable中插入5条数据,将第二个字段值乘2,用于测试Merge的update语句
for i in 1..5 loop
insert Into ntable Values (i,lpad(i*2,2,0), 'nTable','notice');
end loop;
--向ntable中再次插入5条数据,用于测试Merge的insert语句
for i in 6..10 loop
insert Into ntable Values (i,lpad(i,2,0), 'nTable','notice');
end loop;
end;
语句执行完成后,查看两张表中的数据:
三、使用Merge操作,通过ntable数据更新mtable表
Merge Into mtable m --merge into 标明该SQL要对table进行DML操作
Using ntable n --using 标明要按照ntable数据进行比对
On (m.id = n.id) --该条件必须是目标表的主键字段,若为联合主键,则要将相关字段全部写上
When Matched Then
Update Set m.count = n.count , m.remark = 'UPDATE' --此处不能有分号
When Not Matched Then
Insert Values(n.id,n.count,'INSERT');
执行完毕后,查看mTable中数据,与Merge前进行对比,如图所示
从对比图我们可以看到,mTable中ID 1-5的五条数据被更新;然后新插入了ID为6-10的数据;且ID11-15的数据没有变动。
四、总结
通过Merge语句,可以在函数、存储过程中省掉复杂的逻辑判断,常用于两张表数据的信息同步,这样不仅使程序变得更加简洁明了,更增强了程序的可读性。