【发布时间】:2013-01-11 10:04:16
【问题描述】:
有谁知道通过调用 INSERT 来使 HSQLDB 更新列的解决方案。我希望我的代码能够插入,如果已经有数据,则更新该数据。我知道 MySQl,我相信,有'ON DUPLICATE KEY UPDATE'。我似乎找不到任何关于此的最新文档。
【问题讨论】:
有谁知道通过调用 INSERT 来使 HSQLDB 更新列的解决方案。我希望我的代码能够插入,如果已经有数据,则更新该数据。我知道 MySQl,我相信,有'ON DUPLICATE KEY UPDATE'。我似乎找不到任何关于此的最新文档。
【问题讨论】:
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 语法
【讨论】:
一个好的样本有时会更好the formal documentation on MERGE statement :)
示例 1
对于具有 tho 列(COL_A 和 COL_B)的表 (MY_TABLE),其中第一列是主键:
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_A 和 COL_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
享受吧!
【讨论】: