這是從Oracle Database 12 documentation INSERT語句:甲骨文插入使用check選項
WITH CHECK OPTION
WITH CHECK OPTION指定表明,Oracle數據庫禁止 任何表或改變該視圖將生成子查詢中不包含的 的行。在用於DML 語句的子查詢中時,可以在FROM 子句中的子查詢中指定此子句,但不在WHERE子句中的子查詢中指定此子句。
我不能作出最後一句的意義:
當一個DML語句的子查詢中使用,你可以在FROM子句指定一個子查詢這個 條款,但沒有在子查詢在 WHERE子句中。
它似乎意味着WITH CHECK OPTION應該直接在FROM子句之後,當插入有子查詢時。但它不起作用。恰恰相反。
當WITH CHECK OPTION位於WHERE子句之後時,它能正常工作,併產生預期的ORA-01402錯誤。
但是,如果直接放在FROM子句之後,它會產生一個「ORA-00907:缺少右括號」的錯誤。即正如文檔所述,將WITH CHECK OPTION放在FROM子句之後,並不是有效的SQL。
SQL> create table t1
2 (
3 col1 number
4 );
Table created.
SQL> insert into
2 (
3 select * from t1
4 where col1 = 1
5 with check option
6 )
7 values (2);
select * from t1
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation
SQL> insert into
2 (
3 select * from t1
4 with check option
5 where col1 = 1
6 )
7 values (2);
where col1 = 1
*
ERROR at line 5:
ORA-00907: missing right parenthesis
SQL>
是文檔錯誤還是我錯過了什麼?
也許「*不在子查詢中的WHERE子句*」是指類似於'where id in(select ... with check option ..)' –
可能。它只是覺得內部選擇將被稱爲子查詢,但我真的不知道。 – johanrex
我會調用內部選擇一個「派生表」,而不是子查詢 –