insert WITH CHECK OPTION的用法

viadeazhu發表於2010-09-12

insert into (

例如:

SQL> insert into (select object_id,object_name,object_type from xxx where object_id<1000  WITH CHECK OPTION)
  2  values(999,'testbyhao','testtype');

這樣的語法看起來很特殊,其實是insert進subquery裡的這張表裡,只不過如果不滿足subquery裡的where條件的話,就不允許插入。

如果插入的列有不在subquery作為檢查的where條件裡,那麼也會不允許插入。

如果不加WITH CHECK OPTION則在插入時不會檢查。

這裡注意,subquery其實是不會實際執行的。

 

例如:

SQL> insert into (select object_id,object_name,object_type from xxx where object_id<1000)
  2  values(1001,'testbyhao','testtype');

1 row created.


SQL> insert into (select object_id,object_name,object_type from xxx where object_id<1000 with check option)
  2  values(1001,'testbyhao','testtype');
insert into (select object_id,object_name,object_type from xxx where object_id<1000 with check option)
                                                           *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

這裡插入的列中沒有object_id,也是不允許插入的:

SQL> insert into (select object_name,object_type from xxx where object_id<1000 with check option)
  2  values('testbyhao','testtype');
insert into (select object_name,object_type from xxx where object_id<1000 with check option)
                                                 *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

為什麼說subquery沒有實際執行呢?看統計資訊吧:


SQL> set autotrace trace exp stat
SQL> select object_id,object_name,object_type from xxx where object_id<1000;

955 rows selected.


        197  consistent gets

SQL> insert into (select object_id,object_name,object_type from xxx where object_id<1000)
  2  values(999,'testbyhao','testtype');

1 row created.


          1  consistent gets

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15415488/viewspace-673594/,如需轉載,請註明出處,否則將追究法律責任。

相關文章