看过很多文章,对键保留表的描述都不太一样,以下是我的研究结果,请各位指教。
我理解的键保留表:
一个复杂视图,指由多张基表组成的视图,若需要出现键保留表的话则必须保证基表中至少有一张表是有主键的!(可利用EMP表和DEPT表生成新的无约束表创建视图测试,无键保留表)
其次,这两张表在进行关联时(可以是表连接也可以是多表查询,但一定要有关联条件!其关联条件其实相当于两表的主外键关系),如果关联条件是使用了主键的话,则外键表为键保留表!例:
CREATE VIEW V
AS
SELECT EMPNO,ENAME,EMP.DEPTNO,DNAME FROM EMP JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO关联条件是DEPTNO,其在DEPT表中是主键,因此作为外键表的EMP表为键保留表!但如果DEPTNO在DEPT表中不是主键,则此视图中无键保留表!再比如:
CREATE TABLE T1
(A INT PRIMARY KEY,B INT)
CREATE TABLE T2
(C INT,D INT)
这两张表T1中有主键,那么可能会出现键保留表,而且只可能T2为键保留表!
CREATE VIEW VV
AS
SELECT A,B,C,D FROM A,B
这样创建的视图中没有键保留表,因为没设关联条件,不存在主外键关系!
CREATE VIEW VV
AS
SELECT A,B,C,D FROM A,B WHERE A.A=B.C

CREATE VIEW VV
AS
SELECT A,B,C,D FROM A JOIN B ON A.A=B.C
这两种创建方法都会出现键保留表,因为有关联条件,并且是用主键进行关联的!
但如果这样写的话就不行:
CREATE VIEW VV
AS
SELECT A,B,C,D FROM A JOIN B ON A.B=C.D
因为关联条件不是主键字段!是否为键保留表可用如下数据字典确认:
SELECT * FROM USER_UPDATABLE_COLUMNS WHERE TABLE_NAME='VV'
结果集中可更新的字段是来源自键保留表的!