0

我有以下 hsqldb 数据库:

 CREATE TABLE t (id INT IDENTITY, code VARCHAR(10), description VARCHAR(100))
 INSERT INTO t (code, description) VALUES ('C1', 'dining table'), ('C2', 'deck chair')

我需要添加条目,前提是它们不存在于表中。我想一步完成(而不是 SELECT 步骤来确定条目是否在表中,如果不是这种情况,则第二步插入它)

hsqldb 对此有 MERGE 操作。但是,问题是我有一个 id IDENTITY 列,hsqldb 应该自动处理设置值,我不知道如何告诉 MERGE 操作。

 MERGE INTO t USING (VALUES(3, 'C3', 'conference table')) 
   AS vals(x,y,z) ON t.code = vals.y
   WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y, vals.z

这可行,但我必须提供 id (3),并且我需要 hsqldb 自动设置 id(就像上面的 INSERT 操作一样)。我需要这样的东西:

 MERGE INTO t (code, description) USING (VALUES('C3', 'conference table')) 
   AS vals(x,y) ON t.code = vals.x
   WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y

但此查询不起作用,因为 MERGE 操作不允许指定我正在处理的列“(代码,描述)”。

我怎样才能实现它?

ps: http: //hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_merge_statement

4

2 回答 2

2

请参阅插入文档。

您可以使用关键字 DEFAULT 代替值。这将插入列的默认值,或者如果该列定义为 IDENTITY,则插入下一个生成的值。

于 2013-06-19T19:36:04.847 回答
0

我没有尝试过,但可能这应该有效。

这是规范

MERGE INTO <target table> [ [ AS ] <merge correlation name> ] 
USING <table reference> ON <search condition>
<merge operation specification>

现在专注于<merge operation specification>. 这应该扩展到您放置的WHEN MATCHED THEN和/或WHEN NOT MATCHED THEN<merge insert specification>

这应该是常规的 INSERT 语句。要让 HSQL 生成身份,您可以做两件事(同样是理论上的):

  • 省略PK列

    INSERT [ <left paren> <insert column list> <paren right> ]
    [ <override clause> ] VALUES <merge insert value list>
    

    所以在你的情况下

    MERGE INTO t USING (VALUES(3, 'C3', 'conference table')) 
    AS vals(x,y,z) ON t.code = vals.y
    WHEN NOT MATCHED THEN INSERT (code,description) VALUES vals.y, vals.z
    
  • 使用identity()方法

    MERGE INTO t USING (VALUES(3, 'C3', 'conference table')) 
    AS vals(x,y,z) ON t.code = vals.y
    WHEN NOT MATCHED THEN INSERT VALUES identity(), vals.y, vals.z
    

我将尝试测试这个假设,而我需要类似的东西。

于 2014-09-19T11:33:19.423 回答