注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

饥民2011

一直在搬砖

 
 
 

日志

 
 
 
 

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

2012-09-02 22:02:29|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
今日睇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, 上面的语句是能执行的
  评论这张
 
阅读(554)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017