关联更新需要注意的问题
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 可能出现的问题
但自己没做实验,依然觉得不是自己的东西。这次重读,决定要尽量多做实验。
第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 可能出现的问题
相关文章推荐
- 日语口语中需要注意的问题~ 不定期更新
- VS2012_MVC4入门例子、代码视图分离办法、需要注意的坑爹问题等_被坑后不断更新此贴,要转载的话,请使用链接,不要转载内容
- Worldwindjava 更新版本需要注意的问题
- 多个DW同时更新,且表中有关系存在,需要注意的击点问题。
- 实时更新oracle需要注意的问题
- 更新 GCC工具链需要注意的问题
- Hibernate多对多双向关联需要注意的问题(实例说话)
- 网站更新需要注意的几个问题
- hibernate级联更新外键 需要注意的问题
- 解决算法问题时需要注意的问题(持续更新中)
- 网站更新需要注意的几个问题
- 多个DW同时更新,且表中有关系存在,需要注意的击点问题。
- 动态规划需要注意的问题(动态更新中)
- 如果表单有中文参数值,也需要注意编码问题
- Hibernate使用二级缓存时,createSQLQuery需要注意的问题
- CDM业务单据,表体单价列赋值所需要注意的问题
- 初次配置project server 2013 需要注意的问题
- (转)ASIC设计中各个阶段需要注意的问题——节选
- rsa加密--选择padding模式需要注意的问题。。。
- Xcode中使用SVN(进行多人开发)需要注意的问题