merge into与update相关更新

相关更新与merge into这两个的更新方式非常方式非常相似,但是有所区别。以下是两个更新方式的测试过程:

----相关更新的测试:
--创建两个测试表t4、t5:

SQL> create table t4(
  2  id number(2),
  4  name varchar2(6),
  5  created date);
Table created.

SQL> create table t5(
  2  id number(2),
  4  name varchar2(6),
  5  created date);
Table created.

--往两个表中插入数据:
insert into t4 values(12,'eemm',sysdate);
insert into t4 values(13,'',sysdate);
insert into t4 values(14,'',sysdate);
insert into t4 values(15,'ookk',sysdate);

insert into t5 values(12,'','');
insert into t5 values(13,'hhss',sysdate);
insert into t5 values(14,'hhll',sysdate);
insert into t5 values(15,'','');

--查看个表的数据:
SQL> select * from t4;
 ID NAME   CREATED
--- ------ -------------------
 12 eemm   2016-10-21 18:04:18
 13        2016-10-21 18:04:18
 14        2016-10-21 18:04:18
 15 ookk   2016-10-21 18:04:20

SQL> select * from t5;
 ID NAME   CREATED
--- ------ -------------------
 12
 13 hhss   2016-10-21 17:50:00
 14 hhll   2016-10-21 17:50:00
 15

--直接更新:
SQL> update t4 set name =(select  name from t5 where t4.id=t5.id);
4 rows updated.

SQL> select * from t4;
 ID NAME   CREATED
--- ------ -------------------
 12        2016-10-21 18:04:18
 13 hhss   2016-10-21 18:04:18
 14 hhll   2016-10-21 18:04:18
 15        2016-10-21 18:04:20
这个更新明显是错误的。对于该例子,其实预计指向跟新2条数据的,但最后更新了4条,这表明给更新出问题了,
从查询的数据来看,更新后的name字段应该都有数据的。
有时候,感觉很爽快,以为是更新对了,直接commit提交了,但是最好要检查后的效果是不是预想的效果,
或者预计更新数据的条数,跟预期更新数据条数相差大的,可能就是更新错误的,这时候就要回滚到更新前的数据。

--正确的更新语句:
SQL> update t4 set name =(select  name from t5 where t4.id=t5.id) where t4.name is null;
2 rows updated.

SQL> select * from t4;
 ID NAME   CREATED
--- ------ -------------------
 12 eemm   2016-10-21 18:04:18
 13 hhss   2016-10-21 18:04:18
 14 hhll   2016-10-21 18:04:18
 15 ookk   2016-10-21 18:04:20

所以这里提醒:生成环境中要进行大量数据的相关更新的时候,最好要先进行测试执行的语句是否为
正确的语句,更新后还要看看更新数据的效果,最后确定了,再提交任务,避免惹来麻烦。

----merge into更新方法:
--原表t5原来的数据:
SQL> select * from t5;
 ID NAME   CREATED
--- ------ -------------------
 12
 13 hhss   2016-10-21 17:50:00
 14 hhll   2016-10-21 17:50:00
 15

--测试表t6:
create table t6(
id number(2),
name varchar2(6),
created date);

--往表t6中插入数据:
insert into t6 values(12,'eemm',sysdate);
insert into t6 values(13,'hhss',sysdate);
insert into t6 values(14,'hhll',sysdate);
insert into t6 values(15,'ookk',sysdate);
insert into t6 values(16,'kkkk',sysdate);

SQL> select * from t6;
 ID NAME   CREATED
--- ------ -------------------
 12 eemm   2016-10-23 15:17:06
 13 hhss   2016-10-23 15:17:06
 14 hhll   2016-10-23 15:17:06
 15 ookk   2016-10-23 15:17:06
 16 kkkk   2016-10-23 15:17:09

--更新1(只更新name字段:数据多的表t6往数据少的表t5跟新或插入):
SQL> merge into t5 t 
  2  using t6 d on (t.id=d.id)
  3  when matched then
  4  update  set t.name = d.name
  5  when not matched then
  6  insert (t.id,t.name) values(d.id,d.name);
5 rows merged.

SQL> select * from t5;
 ID NAME   CREATED
--- ------ -------------------
 12 eemm
 13 hhss   2016-10-21 17:50:00
 14 hhll   2016-10-21 17:50:00
 15 ookk
 16 kkkk
SQL> commit;
Commit complete.
表t5的数据也作为更新2的基表数据。

--创建测试表t7并查询:
create table t7(
id number(2),
name varchar2(6),
tel varchar2(11),
created date);
--插入数据:
insert into t7 values(12,'eemm','13645678921',sysdate);
insert into t7 values(13,'','13645678921',sysdate);
insert into t7 values(14,'','13645678921',sysdate);
insert into t7 values(15,'ookk','13645678922',sysdate);
insert into t7 values(16,'kkkk','13645678923',sysdate);
--查询:
SQL> select * from t7;
 ID NAME   TEL         CREATED
--- ------ ----------- -------------------
 12 eemm   13645678921 2016-10-23 14:35:49
 13        13645678921 2016-10-23 14:35:49
 14        13645678921 2016-10-23 14:35:49
 15 ookk   13645678922 2016-10-23 14:35:50
 16 kkkk   13645678923 2016-10-23 14:42:09


--更新2(只更新name字段:数据多的表t5往数据少的表t7跟新或插入):
SQL> merge into t7
  2  using t5 on (t7.id=t5.id)
  3  when matched then
  4  update  set t7.name = t5.name
  5  when not matched then
  6  insert (t7.id,t7.name) values(t5.id,t5.name);
5 rows merged.

SQL> select * from t7;
 ID NAME   TEL         CREATED
--- ------ ----------- -------------------
 12 eemm   13645678921 2016-10-23 14:35:49
 13 hhss   13645678921 2016-10-23 14:35:49
 14 hhll   13645678921 2016-10-23 14:35:49
 15 ookk   13645678922 2016-10-23 14:35:50
 16 kkkk   13645678923 2016-10-23 14:42:09
这样就是达到了预期的效果。

这两种的更新方法,都是为了整合两个数据不整齐表的数据,整合成一个比较完成、可读性高的数据表。
基本都是从数据多的表往数据少的数据表插入或者更新。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31392094/viewspace-2126960/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31392094/viewspace-2126960/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值