视图中的键保留表:
连接视图中所有更新的列必须映射到键保留表的列中,也就是视图DML操作的列必须映射到键保留表的列中
键保留表的理解是:一个复杂视图,若需要出现键保留表的话则必须保证基表中至少有一张表是有主键的!
其次,这两张表在进行关联时(可以是表连接也可以是多表查询,但一定要有关联条件,其关联条件其实相当于两表的主外键关系),如果关联条件是使用了主键的话,则外键表为键保留表。
一下验证测试:
1.建立两张表,并插入数据
SQL> create table biao1 (id number, name varchar2(10));
表已创建。
SQL> create table biao2 (id number, name varchar2(10));
表已创建。
SQL> insert into biao1 values (1,'aa');
已创建 1 行。
SQL> insert into biao1 values (2,'bb');
已创建 1 行。
SQL> insert into biao2 values (1,'cc');
已创建 1 行。
SQL> insert into biao2 values (2,'dd');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from biao1;
ID NAME
---------- --------------------
1 aa
2 bb
SQL> select * from biao2;
ID NAME
---------- --------------------
1 cc
2 dd
SQL>
2.创建基于这两张表的查询视图biao_view1
SQL> ed
已写入 file afiedt.buf
1 create view biao_view1(id,name1,name2) as select biao1.id,biao1.name,biao2.name
2 from biao1,biao2
3* where biao1.id=biao2.id
SQL> /
视图已创建。
SQL> select * from biao_view1;
ID NAME1 NAME2
---------- -------------------- --------------------
1 aa cc
2 bb dd
3.更新视图报错,报无法修改与非键值保存表对应的列
SQL> update biao_view1 set name1='jack' where id=1;
update biao_view1 set name1='jack' where id=1
第 1 行出现错误:
ORA-01779: 无法修改与非键值保存表对应的列
SQL> update biao_view1 set name2='jack' where id=1;
update biao_view1 set name2='jack' where id=1
第 1 行出现错误:
ORA-01779: 无法修改与非键值保存表对应的列
查询视图user_updatable_columns看基表是否有键保留表
SQL> select * from user_updatable_columns where TABLE_NAME='BIAO_VIEW1';
OWNER TABLE_NAME COLUMN_NAM UPDATA INSERT DELETA
---------- ---------- ---------- ------ ------ ------
SYS BIAO_VIEW1 NAME1 NO NO NO
SYS BIAO_VIEW1 NAME2 NO NO NO
SYS BIAO_VIEW1 ID NO NO NO
4.在表biao2上建立主键约束
SQL> alter table biao2 add constraint pk_id1 primary key (id);
表已更改。
重新编译视图:
SQL> alter view biao_view1 compile;
视图已变更。
再次查询user_updatable_columns(表biao1是键保留表)
SQL> select * from user_updatable_columns where TABLE_NAME='BIAO_VIEW1';
OWNER TABLE_NAME COLUMN_NAM UPDATA INSERT DELETA
---------- ---------- ---------- ------ ------ ------
SYS BIAO_VIEW1 ID YES YES YES
SYS BIAO_VIEW1 NAME1 YES YES YES
SYS BIAO_VIEW1 NAME2 NO NO NO
SQL>
5.更新视图中的键保留表中的列(更新成功)
SQL> update biao_view1 set name1='jack' where id=1;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from biao1;
ID NAME
---------- --------------------
1 jack
2 bb
插入视图中的键保留表中的列
SQL> insert into biao_view1 (id,name1) values (3,'xin');
已创建 1 行。
SQL> commit;
提交完成。
通过视图修改biao2(非键保留表)中列报错
SQL> update biao_view1 set name2='shak' where id=1;
update biao_view1 set name2='shak' where id=1
第 1 行出现错误:
ORA-01779: 无法修改与非键值保存表对应的列
6.在表biao1上建立主键约束
SQL> alter table biao1 add constraint pk_ids primary key (id);
表已更改。
重新编译视图
SQL> alter view biao_view1 compile;
视图已变更。
表biao2也变成了键保留表
SQL> select * from user_updatable_columns where TABLE_NAME='BIAO_VIEW1';
OWNER TABLE_NAME COLUMN_NAM UPDATA INSERT DELETA
---------- ---------- ---------- ------ ------ ------
SYS BIAO_VIEW1 ID YES YES YES
SYS BIAO_VIEW1 NAME1 YES YES YES
SYS BIAO_VIEW1 NAME2 YES YES YES
通过视图更新表biao2中列成功
SQL> update biao_view1 set name2='jack' where id=1;
已更新 1 行。
SQL> select * from biao2;
ID NAME
---------- --------------------
1 jack
2 dd
7.删除视图并重建视图加上with check option字句
SQL> drop view biao_view1;
视图已删除。
SQL> create view biao_view1(id,name1,name2) as select biao1.id,biao1.name,biao2.name
2 from biao1,biao2
3 where biao1.id=biao2.id
4 with check option ;
视图已创建。
SQL> select * from user_updatable_columns where TABLE_NAME='BIAO_VIEW1';
OWNER TABLE_NAME COLUMN_NAM UPDATA INSERT DELETA
---------- ---------- ---------- ------ ------ ------
SYS BIAO_VIEW1 NAME1 YES YES YES
SYS BIAO_VIEW1 NAME2 YES YES YES
SYS BIAO_VIEW1 ID NO NO NO
这是所有连接的列是不可以更新的