【问题标题】:hsqldb update on inserthsqldb 插入时更新
【发布时间】:2013-01-11 10:04:16
【问题描述】:

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

【问题讨论】:

    标签: jdbc insert hsqldb


    【解决方案1】:

    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 语法

    【讨论】:

      【解决方案2】:

      一个好的样本有时会更好the formal documentation on MERGE statement :)

      示例 1

      对于具有 tho 列(COL_ACOL_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_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
      

      享受吧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 2012-10-12
        相关资源
        最近更新 更多