3
INSERT INTO (SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234) 
   VALUES(SEQ.NEXTVAL,2456,'qwew','12312','12312');

对于上面的查询,我想,我只能将行插入tablecol1具有1234. 但是,我能够插入除 for 以外1234的值col1

问题:

为什么我们需要上面的查询?使用它的现实生活场景是什么?

4

2 回答 2

1

它基本上是一个允许可更新视图的构造。对于多表方案,INSERT 只能针对其中一个基础表。视图和要插入的表之间必须存在一对一的关系。

您显示的查询是扩展相同概念的内联视图。

阅读此处了解更多文档

http://docs.oracle.com/cd/E17952_01/refman-5.1-en/view-updatability.html

现实生活 - 以便能够通过 View 做到这一点,从而提供灵活性、轻松性。但欢迎提供更有价值的输入。

于 2013-09-19T15:23:43.253 回答
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

不过,我认为内联视图没有办法做到这一点。

于 2013-09-19T15:34:13.033 回答