Oracle-在不存在的地方插入select max

时间:2019-11-19 21:21:55

标签: sql oracle

我正在尝试编写如下内容。

目标是不要有多个记录具有相同的描述。在描述列上有唯一的约束。

我必须编写一个插入查询,即使它被意外执行了多次,该插入查询也应该工作(没有抛出错误)。 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为空,并且插入失败并违反主键

select max(id)+1, 'test record' from test
where not exists ( select 1 from test where description = 'test record' );

如果我必须交替编写带有变量的sql块并开始/结束以完成此操作,那么我很好 但是,任何建议都值得赞赏

2 个答案:

答案 0 :(得分:1)

将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

答案 1 :(得分:1)

即使没有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