gpt4 book ai didi

sql - 插入查询

转载 作者:行者123 更新时间:2023-12-04 12:29:34 24 4
gpt4 key购买 nike

在查找 Oracle 的 INSERT 语法时,我注意到您可以插入查询,例如

insert into (select * from dept) (deptno, dname) values (99, 'new department');

有人可以解释一下这是什么意思吗?插入到查询中可以实现什么,而不能直接插入到表中?

更新:到目前为止,这似乎只是一种替代语法,所以我可以写
insert into (select deptno, dname from dept) values (99, 'new department');

代替
insert into dept (deptno, dname) values (99, 'new department');

同样的事情,同样的执行计划。查询是否返回记录并不重要。这个:
insert into (select deptno, dname from dept where 1 = 0) values (99, 'new department');

再次导致相同的执行计划。所以我们可能会假设,只要我们只从一张表中选择列,子查询是什么样子就真的无关紧要。但不是。这个:
insert into (select deptno, dname from dept cross join some_table)
values (99, 'new department');

导致“ORA-01779:无法修改映射到非键保留表的列”或“ORA-01732:此 View 上的数据操作操作不合法”。

我的印象是 Oracle 决定允许插入到查询中,因为它们允许插入到 View 中,这里的子查询还有什么是临时 View ?因此,当您可以插入到 View 中时,它们当然也可以让您插入到临时 View 中,但当然没有人会使用这种语法:-)

但也许我错了?也许这种语法确实提供了一些我还不知道的东西?如果是这样告诉我:-)

最佳答案

插入子查询允许使用 WITH CHECK OPTION 限制结果.

例如,假设您想允许除“新部门”之外的任何部门名称。这个使用不同值的例子工作正常:

SQL> insert into
2 (select deptno, dname from dept where dname <> 'new department' WITH CHECK OPTION)
3 values (98, 'old department');

1 row created.

但是如果插入了那个错误的值,它会抛出一个错误:
SQL> insert into
2 (select deptno, dname from dept where dname <> 'new department' WITH CHECK OPTION)
3 values (99, 'new department');
(select deptno, dname from dept where dname <> 'new department' WITH CHECK OPTION)
*
ERROR at line 2:
ORA-01402: view WITH CHECK OPTION where-clause violation

我从未见过在野外使用此功能。 View 具有此选项,因此您应该能够对子查询执行相同的操作。我不确定为什么有人会想要这样做,但对提供 INSERT 的 SELECT 语句施加限制也很容易。如果 INSERT 使用 VALUES,则可以轻松将其转换为 SELECT 语句。

您必须深入研究语法图才能看到此功能: insert --> single_table_insert --> 子查询 --> query_block --> table_reference --> query_table_expression --> subquery_restriction_clause。

关于sql - 插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com