关于Oracle Insert 语句的子查询 和 with check option的用法

今日睇ocp教程  发现 insert语句还可以子查询例如:

INSERT INTO
      (SELECT employee_id, last_name,
                email, hire_date, job_id, salary,
                department_id
       FROM employees
       where department_id = 50
       )

VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-06-1999', 'DD-MM-YYYY'),
'ST_CLERK', 5000,50)



系唔系有d无里头,多q余的感觉, 的确。特别是那个 "where department_id = 50"
 我系sybase一般都是写成下面的样子的:
INSERT INTO employees(      
employee_id, last_name,
                email, hire_date, job_id, salary,
                department_id)

VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-06-1999', 'DD-MM-YYYY'),
'ST_CLERK', 5000,50)
他们之前有什么区别呢, 我测过 效果系一样的, 插入的果一条记录都系咁 如下图:


真系一沟样。。。。


但系 加入with check option 就大大不同了。
INSERT INTO
      (SELECT employee_id, last_name,
                email, hire_date, job_id, salary,
                department_id
       FROM employees
       where department_id = 50
witch check option
       )

VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-06-1999', 'DD-MM-YYYY'),
'ST_CLERK', 5000,50)
这个一句能正常执行。



但是,修改一下, 将要插入的department_id 改成60 就失败了。

INSERT INTO
      (SELECT employee_id, last_name,
                email, hire_date, job_id, salary,
                department_id
       FROM employees
       where department_id = 50
       with check option
       )

VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-06-1999', 'DD-MM-YYYY'),
'ST_CLERK', 5000,60)



因为加入with check option 不满足subquery中的where条件的话,就不允许插入.
上面的的where 条件是 department_id = 50, 而插入的值是60 所以失败了。

with check option还有另1个限制:。where条件指定的列如果不在insert的列中,也不允许插入
例如:

INSERT INTO
      (SELECT employee_id, last_name,
                email, hire_date, job_id, salary
               
       FROM employees
       where department_id = 50
       with check option
       )

VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-06-1999', 'DD-MM-YYYY'),
'ST_CLERK', 5000)




也就是要保证插入的数据 要跟子查询相对应。


如果不加入with check option, 上面的语句是能执行的
posted @ 2013-04-02 00:55  Gateman  阅读(525)  评论(0编辑  收藏  举报