5

有谁知道通过调用 INSERT 来使 HSQLDB 更新列的解决方案。我希望我的代码能够插入,如果已经有数据,则更新该数据。我知道 MySQl,我相信,有'ON DUPLICATE KEY UPDATE'。我似乎找不到任何关于此的最新文档。

4

2 回答 2

10

一个好的样本有时比关于 MERGE 声明的正式文档更好:)

样品 1

对于MY_TABLE具有列 (COL_ACOL_B) 的表 ( ),其中第一列是主键:

MERGE INTO MY_TABLE AS t USING (VALUES(?,?)) AS vals(a,b) 
        ON t.COL_A=vals.a
    WHEN MATCHED THEN UPDATE SET t.COL_B=vals.b
    WHEN NOT MATCHED THEN INSERT VALUES vals.a, vals.b

样品 2

让我们在表中添加另一列 ( COL_C):

MERGE INTO MY_TABLE AS t USING (VALUES(?,?,?)) AS vals(a,b,c) 
        ON t.COL_A=vals.a
    WHEN MATCHED THEN UPDATE SET t.COL_B=vals.b, t.COL_C=vals.c
    WHEN NOT MATCHED THEN INSERT VALUES vals.a, vals.b, vals.c

样品 3

现在让我们将主键更改为由前两列 (COL_ACOL_B) 组成:

MERGE INTO MY_TABLE AS t USING (VALUES(?,?,?)) AS vals(a,b,c) 
        ON t.COL_A=vals.a AND t.COL_B=vals.b
    WHEN MATCHED THEN UPDATE SET t.COL_C=vals.c
    WHEN NOT MATCHED THEN INSERT VALUES vals.a, vals.b, vals.c

享受!

于 2015-08-16T11:28:31.730 回答
4

HSQLDB 为此提供了 MERGE 语句。

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

或者,您可以编写一个简短的存储过程来插入,然后捕获任何违反约束的异常并执行更新。

http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_psm_handlers

更新:从 2.3.4 版开始,HSQLDB 还支持 ON DUPLICATE KEY 的 MySQL 语法

于 2013-01-28T16:17:18.590 回答