视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
什么是OracleKey-PreservedTable和什么样的视图可以进行DML操作
2020-11-09 12:45:59 责编:小采
文档


在通过DML操作Oracle的视图的时候,有一个很重要的条件是操作的base表必须是Key-Preserved Table.那么,什么是Key-Preserved Table

在通过DML操作Oracle的视图的时候,有一个很重要的条件是操作的base表必须是Key-Preserved Table.
那么,什么是Key-Preserved Table呢.Oracle给出的定义是:
A table is key preserved if every key of the table can also be a key of the result of the join.
It is not necessary that the key or keys of a table be selected for it to be key preserved.

It is sufficient that if the key or keys were selected, then they would also be key(s) of the result of the join.

如果某一个表的主键可以作为这个join结果(view通常是几个表的join结果)的主键,那么这个表就是key preserved table.

这个表的主键并非一定要出现在select出来的结果集中(select list里面),但是如果其出现在结果集中,那么它必须可以满足作为这个结果集的主键的要求.

来看一个例子,有这样两个表,dept和employee,以及基于这两个表的testv视图

  • 查询这个视图:select * from testv


    在testv这个视图中,employee就是一个key preserved table,而dept不是.
    那么这个视图可以进行的DML为
    delete from testv where empid=1(操作的结果是将employee表中的empid=1的记录delete了,dept表不会有改变)
    delete from testv where deptid=1(操作的结果是将employee表中的empid=1和2的记录都delete了,dept表不会有改变)
    update testv set empname='empx' where edeptid=1
    update testv set empname='empx' where empid=1
    update testv set empname='empx' where deptid=1
    insert into testv(empid,empname,edeptid) values(4,'emp4',2)
    这个视图不可以进行的DML为
    update testv set deptname='deptx' where deptid=1
    update testv set deptname='deptx' where empid=1
    insert into testv(deptid,deptname) values(4,'dept4')
    ORA-01779: cannot modify a column which maps to a non key-preserved table

    下载本文
    显示全文
    专题