INSERT INTO (SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234)
VALUES(SEQ.NEXTVAL,2456,'qwew','12312','12312');
对于上述查询,我想,我只能将行table
插入col1
,其中1234
的值为1234
。但是,我能够为col1
插入{{1}}以外的值。
问题:
为什么我们需要像上面这样的查询?使用它的现实生活场景是什么?
答案 0 :(得分:1)
它基本上是一个允许可更新视图的构造。对于多表方案,INSERT只能是其中一个基础表。 View和要插入的表之间必须存在One-One关系。
您展示的查询是一个内联视图,扩展了相同的概念。
请阅读此处以获取更多文档
http://docs.oracle.com/cd/E17952_01/refman-5.1-en/view-updatability.html
现实生活 - 能够通过View实现这一目标,提供灵活性和轻松性。但欢迎更多有价值的投入。
答案 1 :(得分:1)
我不知道你能做到这一点,说实话,但我想这是你可以插入视图的事实的副产品,而(SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234)
是一个内联视图。
正如您所暗示的那样,在INSERT的情况下没有多大意义,但它对UPDATE或DELETE很有用,通常涉及到连接:
update (select id, col1 from table1
join table2 on table2.col2 = table1.col2
where table2.col3 = 'X'
)
set col1 = 'Y';
只有在Oracle认为该列可以更新时才会有效,这要求在此示例中有一个从table1到table2的外键。
使用“真实”视图,您可以对插入内容进行限制:
create view myview as SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234
WITH CHECK OPTION;
WITH CHECK OPTION
子句意味着新行不得违反视图的WHERE子句:
SQL> insert into myview (id, col1) values (SEQ.NEXTVAL, 9876);
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
我不认为有一种方法可以使用内联视图。