视图中的键保留表

视图中的键保留表:

连接视图中所有更新的列必须映射到键保留表的列中,也就是视图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

这是所有连接的列是不可以更新的

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值