INSERT INTO (SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234)
VALUES(SEQ.NEXTVAL,2456,'qwew','12312','12312');
对于上面的查询,我想,我只能将行插入table
到col1
具有1234
. 但是,我能够插入除 for 以外1234
的值col1
。
问题:
为什么我们需要上面的查询?使用它的现实生活场景是什么?
它基本上是一个允许可更新视图的构造。对于多表方案,INSERT 只能针对其中一个基础表。视图和要插入的表之间必须存在一对一的关系。
您显示的查询是扩展相同概念的内联视图。
阅读此处了解更多文档
http://docs.oracle.com/cd/E17952_01/refman-5.1-en/view-updatability.html
现实生活 - 以便能够通过 View 做到这一点,从而提供灵活性、轻松性。但欢迎提供更有价值的输入。
老实说,我不知道您可以这样做,但我认为这是您可以插入视图的副产品,并且(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
不过,我认为内联视图没有办法做到这一点。