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');

Demo on DB Fiddle

以上是关于Oracle-在不存在的地方插入select max的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 在不存在的地方插入 [重复]

在不存在的地方插入值

在不存在但线程安全的地方插入(我不想重复)

mybatis oracle -批量插入,存在则更新

oracle表中如果存在就不更新,如果不存在就插入的语句怎么写

oracle数据库,覆盖插入数据---- merge into