HSQLDB -Query - 如果不存在则插入第一条记录

Posted

技术标签:

【中文标题】HSQLDB -Query - 如果不存在则插入第一条记录【英文标题】:HSQLDB -Query - insert first record if does not exist 【发布时间】:2017-02-09 15:22:48 【问题描述】:

注意:这个问题专门针对 HSQLDB 和 Informix。

如果表中不存在,我想插入新条目,我知道我们可以使用存在查询基于现有条目插入。

例如:

INSERT INTO test(column1) 
(SELECT DISTINCT 3 
 FROM test  
 WHERE NOT EXISTS (SELECT * FROM test  WHERE column1 =3));

问题是:EXISTS 条件与子查询结合使用,如果子查询返回至少一行,则认为满足条件。那么只有我们可以在 SELECT、INSERT、UPDATE 或 DELETE 语句中使用。

【问题讨论】:

您的 INSERT 看起来有问题。当新数据不存在时,您要插入的新数据在哪里? @fredt:在示例查询中,新数据为3,在选择列表和 EXISTS 子查询的 WHERE 子句中引用。 我不清楚你的问题是什么。您的“问题是”段落概述了为什么 INSERT 语句会按照您所说的去做,所以我不明白哪里有问题。是否有其他一些 DBMS 以某种方式以不同方式处理该问题?如果您有适当的主键约束,如果表中已经存在具有相同键数据的行,则简单的 INSERT 将无法插入;您所要做的就是决定忽略错误(您忽略了一个特定的错误条件,而不是全部)。如果您愿意,可以使用存储过程来处理。请澄清你的问题。 我的问题很简单。如果不存在,我想插入一条记录。标准 - 在第一次插入之前,表中不会有任何记录。是的。我们可以使用“IF NOT EXISTS”在 sql 中处理这些情况。查询 - 如果不存在(select * from test where column1=1) insert into test(column1) values(1); @fredt - 我的标准是空表。除了像往常一样,我试图插入一些不存在的数据。这意味着,我不知道表是空的还是有一些记录应该为我处理。 【参考方案1】:

这是创建表语句:

CREATE TABLE test(column1 int)

这是 HSQLDB 的 INSERT 语句。它使用 SQL 标准语法并且应该也可以与 Informix 一起使用:

INSERT INTO test(column1) 
    SELECT * FROM (VALUES (3)) 
    WHERE NOT EXISTS (SELECT * FROM test  WHERE column1 =3)

这是显示表中行的 SELECT 语句

SELECT * FROM test

这是 SELECT 的结果

 COLUMN1 
 ------- 
 3       

 1 row(s) in 0 ms

由于 Informix 不支持 VALUES 表构造函数,因此您需要创建一个只有一行的单独表,类似于 Oracle 的 DUAL 表。然后,您可以在 SELECT 中使用此表。

INSERT INTO test(column1) 
    SELECT 3 FROM single_row_table 
    WHERE NOT EXISTS (SELECT * FROM test  WHERE column1 =3)

【讨论】:

它不工作。正如我所描述的,最初表是空的,在这种情况下,它将返回 0 条记录作为插入并且永远不会工作。 该语句在表为空时插入一行3 不。我对 HSQLDB 进行了同样的尝试,但它不起作用。 我在答案中添加了 CREATE 和 SELECT 语句以及结果。 不错!它适用于 HSQL DB,但不适用于 Informix。

以上是关于HSQLDB -Query - 如果不存在则插入第一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 线程中将记录插入数据库?

如果不存在则插入数据的过程pl sql

如果我在插入后重新启动识别器列,则脚本文件中的错误

Codeigniter 如果不存在则插入,如果不存在则更新

MySQL INSERT插入条件判断:如果不存在则插入

将列标题插入 hsqldb 文本文件