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

本文详细介绍了 SQL 中使用 INSERT 语句进行子查询的用法,特别关注了如何利用 WITH CHECK OPTION 实现数据一致性验证,并通过实例展示了其在实际场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今日睇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, 上面的语句是能执行的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值