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')

テーブルにまだ存在しない場合にのみ、エントリを追加する必要があります。これを1つのステップで実行したいと思います(エントリがテーブルにあるかどうかを確認するSELECTステップと、そうでない場合はINSERTする2番目のステップの代わりに)

hsqldb には、このための MERGE 操作があります。ただし、問題は、hsqldb が自動的に値を設定する必要がある id IDENTITY 列があり、これを 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

4

2 に答える 2

0

I did not try it but potentially this should work.

This is specification

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

Now focus on <merge operation specification>. This should be expanded into WHEN MATCHED THEN and/or WHEN NOT MATCHED THEN where you put <merge insert specification>

Which should be regular INSERT statement with. To let HSQL to generate identity you could do 2 things (again theoretical):

  • Ommit PK column

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

    So in your case

    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
    
  • Using identity() method

    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
    

I will try to test this hypothesis, while I need to something similar.

于 2014-09-19T11:33:19.423 に答える