您的位置:首页 > 其它

关联更新需要注意的问题

2011-06-04 22:04 381 查看
第二次重读陈吉平大师的《Oracle高可用环境》,看了之后依然是受益匪浅。通过第一次阅读,对一些知识已经有些了解。

但自己没做实验,依然觉得不是自己的东西。这次重读,决定要尽量多做实验。

第15章描述的是高可用环境在线维护的一些相关经验。

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott

--1.创建表test1,test2
SQL> CREATE TABLE test1 (ID NUMBER ,NAME VARCHAR2(10));
Table created

SQL> CREATE TABLE test2 (ID NUMBER ,NAME VARCHAR2(10));
Table created

--2.分别向test1种插入5条记录,test2中插入3条记录
SQL> INSERT INTO test1 (SELECT LEVEL ,'name'||LEVEL FROM dual CONNECT BY level<=5);
5 rows inserted

SQL> INSERT INTO test2 (SELECT LEVEL ,'new'||LEVEL FROM dual CONNECT BY level<=3);
3 rows inserted

SQL> commit;
Commit complete

SQL> SELECT * FROM test1;

ID NAME
---------- ----------
1 name1
2 name2
3 name3
4 name4
5 name5

SQL> SELECT * FROM test2;

ID NAME
---------- ----------
1 new1
2 new2
3 new3

需求:

用id关联test1,test2把test2中的name更新到test1中。注意:test2中有三条记录,test1中有5条记录。
我们希望只更新test1表中name对应的id与test2种id相同的记录。
如果test1.id=test2.id作为两表的关联条件,看看结果是否和我们想要的一致。

SQL> UPDATE TEST1
2 SET TEST1.NAME = (SELECT TEST2.NAME FROM TEST2 WHERE TEST1.ID = TEST2.ID) ;
5 rows updated

SQL> SELECT * FROM test1;
ID NAME
---------- ----------
1 new1
2 new2
3 new3
4
5
--很明显test1表中id为4,5的记录对应的name被更新为空了,这不是我们想要的结果。怎么办呢?

SQL> rollback;
Rollback complete

--关联update的时候,约束条件是在外部限制的。内部的条件仅是获得数据源的条件。
SQL> UPDATE TEST1
2 SET TEST1.NAME = (SELECT TEST2.NAME FROM TEST2 WHERE TEST1.ID = TEST2.ID)
3 WHERE TEST1.ID IN (SELECT ID FROM TEST2);
3 rows updated

SQL> SELECT * FROM test1;

ID NAME
---------- ----------
1 new1
2 new2
3 new3
4 name4
5 name5

SQL> commit;
Commit complete

参考 《Oracle高可用环境》--陈吉平 P520 高可用环境之在线维护 15.1.3 可能出现的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: