2013-06-19 80 views
0

我有以下的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步驟以查明條目是否在表格中,如果不是這種情況,則執行第二步INSERT操作)

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 

但此查詢不工作,因爲合併操作不允許指定我工作的這列「(代碼說明)」。

我該如何實現它?

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

回答

2

見INSERT文檔。

您可以使用關鍵字DEFAULT而不是值。這將插入列的默認值,或者如果列被定義爲IDENTITY,則會生成下一個生成的值。

0

我沒有嘗試它,但可能這應該工作。

這是規範

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

現在專注於<merge operation specification>。 WHEN然後再配和/或WHEN NOT MATCHED THEN你把<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 
    
  • 使用身份()方法

    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 
    

我會嘗試測試這個假設,而我需要類似的東西。