|
第二次重读陈吉平大师的《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 可能出现的问题 |