首页 > 数据库 > Oracle > 表连接时update与delete操作需注意的地方
一. 表连接的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/ ,如需转载,请注明出处,否则将追究法律责任。