插入 HSQLDB 的更新

Posted

技术标签:

【中文标题】插入 HSQLDB 的更新【英文标题】:Update on Insert HSQLDB 【发布时间】:2015-04-17 13:05:32 【问题描述】:

我正在尝试重写使用 mysql 数据库的代码以使用 HSQLDB。我有一个INSERT INTO ... ON DUPLICATE KEY UPDATE 查询。对于 HSQLDB 是否有此方法的替代方法。

代码:

PreparedStatement ps = conn.prepareStatement("INSERT INTO user_stats "
    + "(user, balance, kills, level)"
    + " VALUES(?, ?, ?, ?) ON DUPLICATE KEY "
    + "UPDATE balance=VALUES(balance), kills=VALUES(kills), level=VALUES(level)");

ps.setString(1, playername);
ps.setDouble(2, PluginInterract.getESSBalance(playername));
ps.setInt(3, PluginInterract.getKills(playername));
ps.setDouble(4, PluginInterract.getPluginLevel(playername));

【问题讨论】:

【参考方案1】:

从版本 2.3.3(2015 年 6 月)开始,HSQLDB 在 MYS 兼容模式下支持 INSERT INTO ... ON DUPLICATE KEY UPDATE ...

参考:http://hsqldb.org/doc/guide/guide.html#coc_compatibility_mysql

但是2.3.3版本不支持MySQL的Values(COLUMN_NAME)方法。

【讨论】:

【参考方案2】:

不符合the documentation。但是,MERGE 语句可能会执行您想要的操作。这是一个基于MERGE 文档的未经测试的示例:

MERGE INTO user_stats USING (VALUES(?, ?, ?, ?))
    AS vals(user, balance, kills, level) ON user_stats.user = vals.user
    WHEN MATCHED THEN UPDATE SET user_stats.balance = vals.balance, user_stats.kills = vals.kills, user_stats.level = vals.level
    WHEN NOT MATCHED THEN INSERT VALUES vals.user, vals.balance, vals.kills, vals.level

【讨论】:

MERGE INTO tablename USING values section ON collide condition WHEN MATCHED THEN UPDATE SET update fields WHEN NOT MATCHED THEN INSERT VALUES 添加字段 Merge 的语法是否正确? 我展示了一个示例并提供了文档链接。我从未使用过 HSQLDB,也没有可以测试的环境。您必须自己完成这部分。

以上是关于插入 HSQLDB 的更新的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 如果不存在则插入,如果存在则更新

如何知道 Hsqldb "MERGE INTO" 是不是进行了插入或更新

Hibernate Update 在 HSQLDB 中转换删除/插入

LibreOffice Base 的 HSQLDB 触发器更新

更新 ACL 时 JdbcMutableAclService + HSQLDB = BadSqlGrammarException

确保更新发生在 Hibernate/HSQLDB 中的并发锁定?