ITPub博客

首页 > 数据库 > Oracle > 表连接时update与delete操作需注意的地方

表连接时update与delete操作需注意的地方

原创 Oracle 作者:pwz1688 时间:2009-04-13 15:31:21 0 删除 编辑
刚刚在论坛上又看到一则很老的精华贴子,经测试后越发觉的好,于是总结了下,发上来了,以后备用,呵~~~[@more@]

一. 表连接的update测试
/*******************先看下面的测试******************/
SQL> drop table test1;

表已删除。

SQL> drop table test;

表已删除。

SQL> create table test(a number,b number,c number ,d varchar2(6));

表已创建。

SQL> insert into test values(1,1,1,'1');

已创建 1 行。

SQL> insert into test values(2,2,2,'2');

已创建 1 行。

SQL> insert into test values(3,3,3,'3');

已创建 1 行。

SQL> commit;

提交完成。

SQL> create table test1(a number,b number);

表已创建。

SQL> insert into test1 values(1,9);

已创建 1 行。

SQL> commit;

提交完成。

SQL> update (select a.a aa,a.b ab,b.a ba,b.b bb from test a,test b where a.a=b.a) set ab=bb;
update (select a.a aa,a.b ab,b.a ba,b.b bb from test a,test b where a.a=b.a) set ab=bb
*
第 1 行出现错误:
ORA-01779: 无法修改与非键值保存表对应的列
/********给test表添加主键a列***************/
SQL> alter table test add primary key(a);

表已更改。

SQL> update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set ab=bb;
update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set ab=bb
*
第 1 行出现错误:
ORA-01779: 无法修改与非键值保存表对应的列
提示:还是无法更新,因为更新的是test表,test表是根据test1表的a列来更新的,所以应该是给test1表的a列设置主键,下面换作更新test1表,只需将set ab=bb 改为 set bb=ab即可,如下:

SQL> update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set
2 bb=ab;

已更新 1 行。

SQL> select * from test;

A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 3

SQL> select * from test1;

A B
---------- ----------
1 1

SQL> rollback;

回退已完成。

SQL> select * from test1;

A B
---------- ----------
1 9
/*********添加test1表主键a列******************/
SQL> alter table test1 add primary key(a);

表已更改。

SQL> update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set
2 ab=bb;

已更新 1 行。

SQL> select * from test;

A B C D
---------- ---------- ---------- ------
1 9 1 1
2 2 2 2
3 3 3 3

SQL> select * from test1;

A B
---------- ----------
1 9

SQL> rollback;

回退已完成。

SQL> spool off


二. 表连接的delete测试
SQL> select *from test;

A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew

SQL> select *from test1;

A B
---------- ----------
1 1

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a);

已删除 1 行。

SQL> select * from test;

A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew

SQL> select *from test1;

A B
---------- ----------
1 1

SQL> rollback;

回退已完成。

SQL> select *form test;
select *form test
*
第 1 行出现错误:
ORA-00923: 未找到要求的 FROM 关键字


SQL> select * from test;

A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);

已删除 1 行。

SQL> select * from test;

A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew

SQL> select * from test1;

A B
---------- ----------
1 1

SQL> rollback;

回退已完成。

SQL> alter table test drop primary key;

表已更改。

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);

已删除 1 行。

SQL> select *form test;
select *form test
*
第 1 行出现错误:
ORA-00923: 未找到要求的 FROM 关键字


SQL> select * from test;

A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew

SQL> select * from test1;

A B
---------- ----------
1 1

SQL> rollback;

回退已完成。

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test1 b,test a where b.a=a.a);

已删除 1 行。

SQL> select * from test;

A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew

SQL> select *from test1;

A B
---------- ----------
1 1

SQL> rollback;

回退已完成。

SQL> alter table test1 drop primary key;

表已更改。

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);
delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a)
*
第 1 行出现错误:
ORA-01752: 不能从没有一个键值保存表的视图中删除


SQL> alter table test add primary key(a);

表已更改。

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);

已删除 1 行。

SQL> select * from test;

A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew

SQL> select *from test1;

未选定行

SQL> rollback;

回退已完成。

SQL> alter table test1 add primary key(a);

表已更改。

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);

已删除 1 行。

SQL> select *from test;

A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew

SQL> select *from test1;

A B
---------- ----------
1 1

SQL> rollback;

回退已完成。

SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test1 b,test a where b.a=a.a);

已删除 1 行。

SQL> select * from test;

A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew

SQL> select * from test1;

未选定行

SQL> rollback;

回退已完成。

SQL> spool off;
总结:
1.当其中只有一个表有主键的时候
删除没有主键的表记录
2.当两个都有主键的时候
删除表连接中非驱动表的那个表
比如通常的rule模式下from a,b : 就删除a中的,如果是from b,a就删除b中的

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

上一篇: translate函数
下一篇: 搬家了~~
请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    736039