sql - 在 HSQLDB 1.8 中作为单个数据库事务的条件插入?

标签 sql hsqldb

我正在使用一个特定的数据库表,如“集合”数据结构,即,您可以多次尝试插入同一行,但它只会包含一个实例。主键是自然键。例如,我希望以下一系列操作能够正常工作,并且只为俄克拉荷马州生成一行:

insert into states_visited (state_name) values ('Oklahoma');
insert into states_visited (state_name) values ('Texas');     
insert into states_visited (state_name) values ('Oklahoma');

由于相同值的后续插入中的重复主键,我当然会收到错误消息。有没有办法使插入有条件,这样就不会抛出这些错误? IE。仅当自然键不存在时才插入?

我知道我可以做一个 where 子句和一个子查询来首先测试该行的存在,但是这似乎很昂贵。这是一个逻辑“条件插入”操作的 2 个物理操作。 SQL中有这样的东西吗?

仅供引用,我正在使用 HSQLDB 1.8

最佳答案

编辑:刚刚注意到您的问题排除了这个答案。在任何情况下,数据库引擎都必须执行 where 检查,以强制执行唯一约束。

insert ... select 语句允许使用 where 子句:

insert into states_visited (state_name) 
select 'Oklahoma'
where not exists
(
    select  * 
    from    states_visited
    where   state_name = 'Oklahoma'
)

大多数 SQL 数据库将以事务方式执行单个语句。

关于sql - 在 HSQLDB 1.8 中作为单个数据库事务的条件插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374782/

相关文章:

linux - 如果进程被终止,我如何编写脚本来保持 HSQLDB 运行

mysql - 选择满足 where 子句的行以及共享公共(public)键的行

mysql - HSQL 和按位运算?

mysql - 两个查询的总和

c# - 无法连接到数据库服务器

java - 在不同数据库之间复制数据(都支持jdbc)

java - 在同一线程中打开两个 JDBC 事务发生死锁

java - 准备两个具有相似列的数据库表之间的比较查询

mysql - 使用 bash 更新 mysql 列

c# - 我面临着对 IEnumerable(LINQ) > List(RecyclerView) 的巨大性能影响