Oracle-在不存在的地方插入select max
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle-在不存在的地方插入select max相关的知识,希望对你有一定的参考价值。
我正在尝试编写如下内容。
目标是使用相同描述的记录不超过一个。在说明列上我们有唯一的约束。
我必须编写此插入查询,即使它被意外执行了不止一次,它也应该可以工作(没有抛出错误)。列id是表的主键
insert into test (id, description)
select max(id)+1, 'test record' from test
where not exists ( select 1 from test where description = 'test record' );
如果测试表中已经存在一条描述为'test record'的记录,则以下查询的结果的id为null,并且插入失败并违反主键
select max(id)+1, 'test record' from test
where not exists ( select 1 from test where description = 'test record' );
如果我必须交替地用变量编写sql块并开始/结束以完成此操作,那么我很好但是,任何建议,谢谢
答案
将select语句嵌套在另一个查询中,例如:
insert into test (id, description)
select t.id, t.description
from (
select max(id)+1 as id, 'test record' as description
from test
where not exists (select 1 from test where description = 'test record' )
) t
where t.id is not null
请参见demo。
另一答案
使用不带group by
子句的聚合函数会强制查询生成记录,即使where
子句消除了所有行也是如此
一种快速的解决方法是添加(虚拟)group by
子句:
insert into test (id, description)
select max(id)+1, 'test record' from test
where not exists ( select 1 from test where description = 'test record' )
group by 2;
或者,您也可以将聚合函数移至子查询。我发现此解决方案使意图更清晰:
insert into test (id, description)
select t.id, 'test record'
from (select max(id) + 1 id from test) t
where not exists ( select 1 from test where description = 'test record');
以上是关于Oracle-在不存在的地方插入select max的主要内容,如果未能解决你的问题,请参考以下文章