hsqldb与IDENTITY列合并

时间:2013-06-19 15:08:21

标签: hsqldb

我有以下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),我需要自动设置id的hsqldb(就像上面的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

2 个答案:

答案 0 :(得分:2)

请参阅INSERT文档。

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

答案 1 :(得分:0)

我没有尝试过,但可能会这样做。

这是规范

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

现在关注<merge operation specification>。这应该扩展为当匹配时和/或当不匹配时放置<merge insert specification>

哪个应该是常规的INSERT语句。为了让HSQL生成身份,你可以做两件事(理论上再次):

  • Ommit 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
    

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