首页 > 其他分享 >视图中的难点:主键表 About Key-Preserved Tables

视图中的难点:主键表 About Key-Preserved Tables

时间:2023-07-03 16:39:01浏览次数:40  
标签:About join Emp 视图 preserved key table 主键 view


http://wmlm.itpub.net/post/12871/278640

因为在项目中大量地使用了视图,而在视图上的更新上产生了一点儿问题,所以抽时间对可更新视图进行了复习,英文看得多了,也就成了中文

 


测试用表

CREATE TABLE Dept_tab (
Deptno NUMBER(4) PRIMARY KEY,
Dname VARCHAR2(14),
Loc VARCHAR2(13));

CREATE TABLE Emp_tab (
Empno NUMBER(4) PRIMARY KEY,
Ename VARCHAR2(10),
Job varchar2(9),
Mgr NUMBER(4),
Hiredate DATE,
Sal NUMBER(7,2),
Comm NUMBER(7,2),
Deptno NUMBER(2),
FOREIGN KEY (Deptno) REFERENCES Dept_tab(Deptno));

CREATE VIEW Emp_dept_view AS
SELECT e.Empno, e.Ename, e.Deptno, e.Sal, d.Dname, d.Loc
FROM Emp_tab e, Dept_tab d /* JOIN operation */
WHERE e.Deptno = d.Deptno
AND d.Loc IN ('DALLAS', 'NEW YORK', 'BOSTON');In this view,EMP_TAB is a key-preserved table, becauseEMPNO is a key of theEMP_TAB table, and also a key of the result of the join.DEPT_TAB is not a key-preserved table, because although DEPTNO is a key of theDEPT_TAB table, it is not a key of the join.

Rule for DML Statements on Join Views

Any UPDATE,INSERT, or DELETE statement on a join view can modifyonly one underlying base table.

Updating a Join View

The following example shows an UPDATE statement that successfully modifies theEMP_DEPT_VIEW view:


UPDATE Emp_dept_view


SET Sal = Sal * 1.10


WHERE Deptno = 10;




The following UPDATE statement would be disallowed on theEMP_DEPT_VIEW view:


UPDATE Emp_dept_view


SET Loc = 'BOSTON'


WHERE Ename = 'SMITH';




This statement fails with an ORA-01779 error ("cannot modify a column which maps to a non key-preserved table"), because it attempts to modify the underlyingDEPT_TAB table, and theDEPT_TAB table is not key preserved in theEMP_DEPT view.

In general, all modifiable columns of a join view must map to columns of a key-preserved table. If the view is defined using theWITHCHECKOPTION clause, then all join columns and all columns of repeated tables are not modifiable.

So, for example, if the EMP_DEPT view were defined usingWITH CHECKOPTION, then the followingUPDATE statement would fail:


UPDATE Emp_dept_view


SET Deptno = 10


WHERE Ename = 'SMITH';




The statement fails because it is trying to update a join column.

总结:更新一个复杂视图的条件是,只能更新主键表(Key-Preserved )的列;如果WITHCHECKOPTION ,则不能更新公共列;

Deleting from a Join View

You can delete from a join view provided there is one and only one key-preserved table in the join.

The following DELETE statement works on theEMP_DEPT view:


DELETE FROM Emp_dept_view


WHERE Ename = 'SMITH';




This DELETE statement on theEMP_DEPT view is legal because it can be translated to aDELETE operation on the baseEMP_TAB table, and because theEMP_TAB table is the only key-preserved table in the join.

In the following view, a DELETE operation cannot be performed on the view because bothE1 and E2 are key-preserved tables:


CREATE VIEW emp_emp AS


SELECT e1.Ename, e2.Empno, e1.Deptno


FROM Emp_tab e1, Emp_tab e2


WHERE e1.Empno = e2.Empno;


WHERE e1.Empno = e2.Empno;




If a view is defined using the WITHCHECK OPTION clause and the key-preserved table is repeated, then rows cannot be deleted from such a view. For example:


CREATE VIEW Emp_mgr AS


SELECT e1.Ename, e2.Ename Mname


FROM Emp_tab e1, Emp_tab e2


WHERE e1.mgr = e2.Empno


WITH CHECK OPTION;




No deletion can be performed on this view because the view involves a self-join of the table that is key preserved.

一句话总结:You can delete from a join view provided there isone and only one key-preserved table in the join.

Inserting into a Join View

The following INSERT statement on theEMP_DEPT view succeeds, because only one key-preserved base table is being modified (EMP_TAB), and 40 is a validDEPTNO in the DEPT_TAB table (thus satisfying theFOREIGN KEY integrity constraint on theEMP_TAB table).


INSERT INTO Emp_dept (Ename, Empno, Deptno)


VALUES ('KURODA', 9010, 40);




The following INSERT statement fails for the same reason: ThisUPDATE on the base EMP_TAB table would fail: theFOREIGN KEY integrity constraint on theEMP_TAB table is violated.


INSERT INTO Emp_dept (Ename, Empno, Deptno)


VALUES ('KURODA', 9010, 77);




The following INSERT statement fails with anORA-01776 error ("cannot modify more than one base table through a view").


INSERT INTO Emp_dept (Ename, Empno, Deptno)


VALUES (9010, 'KURODA', 'BOSTON');




An INSERT cannot, implicitly or explicitly, refer to columns of a non-key-preserved table. If the join view is defined using theWITH CHECK OPTION clause, then you cannot perform anINSERT to it.

总结:insert成功的条件only one key-preserved base table is being modified并且符合约束;

但如果在join视图中with check option那么你不能再insert了.

相关视图 Three views you can use for modifying join views :USER_UPDATABLE_COLUMNS

Outer Joins

Views that involve outer joins are modifiable in some cases. For example:


CREATE VIEW Emp_dept_oj1 AS


SELECT Empno, Ename, e.Deptno, Dname, Loc


FROM Emp_tab e, Dept_tab d


WHERE e.Deptno = d.Deptno (+);


Columns in the base EMP_TAB table ofEMP_DEPT_OJ1 are modifiable through the view, because EMP_TAB is a key-preserved table in the join.

The following view also contains an outer join:


CREATE VIEW Emp_dept_oj2 AS


SELECT e.Empno, e.Ename, e.Deptno, d.Dname, d.Loc


FROM Emp_tab e, Dept_tab d


WHERE e.Deptno (+) = d.Deptno;


In this view, EMP_TAB is no longer a key-preserved table, because theEMPNO column in the result of the join can have nulls (the last row in theSELECT above). So, UPDATE, DELETE, and INSERT operations cannot be performed on this view.

Consider the following set of views:


CREATE VIEW Emp_v AS


SELECT Empno, Ename, Deptno


FROM Emp_tab;


CREATE VIEW Emp_dept_oj1 AS


SELECT e.*, Loc, d.Dname


FROM Emp_v e, Dept_tab d


WHERE e.Deptno = d.Deptno (+);




In these examples, EMP_V is merged intoEMP_DEPT_OJ1 because EMP_V is a simple view, and so EMP_TAB is a key-preserved table. But if EMP_V is changed as follows:


CREATE VIEW Emp_v_2 AS


SELECT Empno, Ename, Deptno


FROM Emp_tab


WHERE Sal > 1000;




Then, because of the presence of theWHERE clause, EMP_V_2 cannot be merged into EMP_DEPT_OJ1, and henceEMP_TAB is no longer a key-preserved table.

If you are in doubt whether a view is modifiable, then you canSELECT from the view USER_UPDATABLE_COLUMNS to see if it is



=================

http://www.geekinterview.com/talk/11040-key-preserved-table.html

A table is key preserved if every key of the table can also be a key of the result of the join. In key preserved table rows from the base appears at most once. Key preserved table guarantees to return only one copy of each row from the base table.


Code:



SQL> CREATE VIEW emp_dept AS 2 SELECT a.empno, a.ename, a.sal , a.deptno, b.dname 3 FROM emp a, dept b 4 WHERE a.deptno = b.deptno ; View created. SQL> SELECT * FROM emp_dept; EMPNO ENAME SAL DEPTNO DNAME --------- ---------- --------- --------- -------------- 7369 SMITH 5000 20 RESEARCH 7499 ALLEN 2129.6 30 SALES

视图中的难点:主键表 About Key-Preserved Tables_insert

7521 WARD 1663.75 30 SALES 7566 JONES 3959.73 20 RESEARCH 7654 MARTIN 1663.75 30 SALES 7698 BLAKE 3793.35 30 SALES 7782 CLARK 3260.95 10 ACCOUNTING 7788 SCOTT 3993 20 RESEARCH 7839 KING 6655 10 ACCOUNTING 7844 TURNER 1996.5 30 SALES 7876 ADAMS 1464.1 20 RESEARCH 7900 JAMES 1264.45 30 SALES 7902 FORD 3993 20 RESEARCH 7934 MILLER 1730.3 10 ACCOUNTING 14 rows selected.


In the above example emp is key preserved table. Rows from EMP appears only once. DEPT is not a key preserved table. DEPTNO is key column in dept. But it is not a key column in EMP_DEPT view.

in a join,a table is called a key-preserve table if its keys are preserved through the join.every key of the table can also be a key of the resultant join resultset.every primary key or unique key value in the base table must also be unique in the result set of the join.
A)key-preservation is a property of the table inside the join view not the table itself independently.a table may be key preseved in one join view and may not be key preserved in another join view.
B)it is not necessary for the key columns of a table to be selected in the join view for the table to be key preserved.
C)if the key columns of a table is selected in the view defination ,it does not make the the table key preserved.
D)the key-preserved property of the table in a join view does not depend on the data inside the table.it depends on the schema design and the relationship between the tables.
E)a join view may select data from many tables ,any dml operation can modify data from only one underlying table.
F)user can't refer to the columns of a non-key-preserved table in an insert statment.
G)delete operation can be performed on a join view if the join view has one and only one key-preserved table.

 

标签:About,join,Emp,视图,preserved,key,table,主键,view
From: https://blog.51cto.com/u_16174476/6612602

相关文章

  • SQL主键和约束
    SQL主键和约束原创 Lyle_Tu Linux分布式主任 2023-06-1717:08 发表于福建收录于合集#sql5个#数据库7个#linux36个#服务器18个 主键1.工具创建表 列 数据类型 是否null      一个表中,会存很多条记录,需要一个列来唯一标识一条数据。    ......
  • 删除主键
    删除表中已有的主键约束(1)有命名 altertablestudentsdropconstraintyy;(2)无命名可用SELECT  *  from  user_cons_columns;查找表中主键名称得student表中的主键名为SYS_C002715altertablestudentdropconstraintSYS_C00271......
  • 单视图几何
    无穷远点(也称理想点)和无穷远线和无穷远平面2D:这个无穷只能在齐次坐标下表示,在欧式坐标系下并不方便所有理想都可以写成(x1,x2,0),并由比率x1:x2指定一个具体的理想点直线的齐次表示:性质1:对于直线ax+by+c=0,我们可以用向量(a,b,c)T来表示,而且对于任何非零常数k直线ax+by+c=0......
  • 【九】MySQL数据库之视图,触发器与存储过程
    【九】MySQL数据库之视图,触发器与存储过程视图,触发器与存储过程【一】视图视图是一个虚拟表(非真实存在)其本质是【根据SQL语句获取动态的数据集,并为其命名】用户使用时只需使用【名称】即可获取结果集可以将该结果集当做表来使用。使用视图我们可以把查询过程中的临......
  • 视图
    创建create[orreplace]view视图名称[(列名列表)]asselect语句--如果要替换视图,要加上orreplace 视图的检查选项当使用WITHCHECKOPTION子句创建视图时,MySL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。MySOL允许基于另一个视图创......
  • NHibernate主键生成方式
    User.hbm.xml<?xmlversinotallow="1.0"encoding="utf-8"?><hibernate-mappingxmlns="urn:nhibernate-mapping-2.2"><classname="PreordainSolution.PreordainModel.User,PreordainSolution.PreordainModel&quo......
  • 主键索引、唯一索引和普通索引的关系
    主键索引:在数据库中定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。主键索引不能为空。每个表只能有一个主键唯一索引:不允许两行具有相同的索引值。但可以都为NULL。如果......
  • thinkphp6:使用view视图/模板(thinkphp v6.0.12LTS)
    一,在使用之前,需要用composer安装需要的view模块:参见:https://blog.imgtouch.com/index.php/2023/06/29/thinkphp6-bao-cuo-driver-think-not-supported/二,php代码:<?phpdeclare(strict_types=1);namespaceapp\controller;useapp\BaseController;usethink\fa......
  • 单视图几何
    无穷远点(也称理想点)和无穷远线和无穷远平面2D:这个无穷只能在齐次坐标下表示,在欧式坐标系下并不方便所有理想都可以写成(x1,x2,0),并由比率x1:x2指定一个具体的理想点直线的齐次表示:性质1:对于直线ax+by+c=0,我们可以用向量(a,b,c)T来表示,而且对于任何非零常数k直线ax+by+c=0......
  • mybatis中如何获取自增主键
    方法1:在insert标签中使用userGeneratedKeys和keyProperty标签:<insertid=”insertname”usegeneratedkeys=”true”keyproperty=”id”>insertintonames(name)values(#{name})</insert>useGeneratedKeys=true表示开启自动生成主键的功能,keyProperty="id"指......