我有以下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
答案 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
我会尝试测试这个假设,而我需要类似的东西。