我正在尝试编写如下内容。
目标是不要有多个记录具有相同的描述。在描述列上有唯一的约束。
我必须编写一个插入查询,即使它被意外执行了多次,该插入查询也应该工作(没有抛出错误)。 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块并开始/结束以完成此操作,那么我很好 但是,任何建议都值得赞赏
答案 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');