Oracle中关于通过联结视图修改基表的问题
--以下是我测试用的脚本DROPTABLEtest2;DROPTABLEtest1;CREATETABLETEST1(col1NUMBERPRIMARYKEY,col2N...
--以下是我测试用的脚本
DROP TABLE test2;
DROP TABLE test1;
CREATE TABLE TEST1
(
col1 NUMBER PRIMARY KEY,
col2 NUMBER
);
CREATE TABLE TEST2
(
col1 NUMBER,
col3 NUMBER,
FOREIGN KEY(col1) REFERENCES TEST1(col1)
);
INSERT INTO test1 VALUES(1,1.1);
INSERT INTO test1 VALUES(2,1.2);
INSERT INTO test1 VALUES(3,1.3);
INSERT INTO test1 VALUES(4,1.4);
INSERT INTO test2 VALUES(1,2.1);
INSERT INTO test2 VALUES(2,2.2);
INSERT INTO test2 VALUES(3,2.3);
INSERT INTO test2 VALUES(4,2.4);
CREATE OR REPLACE VIEW test_view3 AS
SELECT test1.col1,test1.col2,test2.col3
FROM test1,test2
WHERE test1.col1 = test2.col1
WITH CHECK OPTION constraint test_view_ck;
--脚本结束
执行以下语句:UPDATE test_view3 a SET col2 = 1.3 WHERE a.col1 = 2;
报以下错误:ORA-01779: 无法修改与非键值保存表对应的列
执行以下语句:UPDATE test_view3 a SET col3 = 2.3 WHERE a.col1 = 2;
却能顺利通过,不知道这两者之间有什么差异。
参考资料:http://tianwei0131-163-com.iteye.com/blog/1146722 中有关key_preserved table的部分。按照他的解释应该两个语句执行的结果相反才对。 展开
DROP TABLE test2;
DROP TABLE test1;
CREATE TABLE TEST1
(
col1 NUMBER PRIMARY KEY,
col2 NUMBER
);
CREATE TABLE TEST2
(
col1 NUMBER,
col3 NUMBER,
FOREIGN KEY(col1) REFERENCES TEST1(col1)
);
INSERT INTO test1 VALUES(1,1.1);
INSERT INTO test1 VALUES(2,1.2);
INSERT INTO test1 VALUES(3,1.3);
INSERT INTO test1 VALUES(4,1.4);
INSERT INTO test2 VALUES(1,2.1);
INSERT INTO test2 VALUES(2,2.2);
INSERT INTO test2 VALUES(3,2.3);
INSERT INTO test2 VALUES(4,2.4);
CREATE OR REPLACE VIEW test_view3 AS
SELECT test1.col1,test1.col2,test2.col3
FROM test1,test2
WHERE test1.col1 = test2.col1
WITH CHECK OPTION constraint test_view_ck;
--脚本结束
执行以下语句:UPDATE test_view3 a SET col2 = 1.3 WHERE a.col1 = 2;
报以下错误:ORA-01779: 无法修改与非键值保存表对应的列
执行以下语句:UPDATE test_view3 a SET col3 = 2.3 WHERE a.col1 = 2;
却能顺利通过,不知道这两者之间有什么差异。
参考资料:http://tianwei0131-163-com.iteye.com/blog/1146722 中有关key_preserved table的部分。按照他的解释应该两个语句执行的结果相反才对。 展开
1个回答
展开全部
你对key_preserved table理解有误
什么是键值保存表?
如果基表的每条记录在视图结果中最多出现1次(或者不出现,即不会重复),那么该基表就是键值保存表。
继续用你的脚本
INSERT INTO test2 VALUES(2,3.9);
这时select * from test_view3 where col1=2,返回如下两条数据
2,1.2,2.2
2,1.2,3.9
其中test2才是key_preserved table。所以只能修改col3字段
可以试想,如果执行UPDATE test_view3 a SET col2 = 1.3 WHERE a.col3 = 2.2;这样的语句成功
基表test2中col2被修改,那 视图中2,1.2,3.9这条数据如何显示,update语句没有修改col3=3.9的数据,但是这条数据中col2已经被修改。
所以只能修改key_preserved table
什么是键值保存表?
如果基表的每条记录在视图结果中最多出现1次(或者不出现,即不会重复),那么该基表就是键值保存表。
继续用你的脚本
INSERT INTO test2 VALUES(2,3.9);
这时select * from test_view3 where col1=2,返回如下两条数据
2,1.2,2.2
2,1.2,3.9
其中test2才是key_preserved table。所以只能修改col3字段
可以试想,如果执行UPDATE test_view3 a SET col2 = 1.3 WHERE a.col3 = 2.2;这样的语句成功
基表test2中col2被修改,那 视图中2,1.2,3.9这条数据如何显示,update语句没有修改col3=3.9的数据,但是这条数据中col2已经被修改。
所以只能修改key_preserved table
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询