1

我正在根据这篇很棒的帖子实施 upsert:Insert, on duplicate update in PostgreSQL? 这对 psql 非常有效。但是,我无法将相同的查询触发到我用于测试的 hsqldb 中。我的 sql 看起来像这样:

UPDATE account set name = ?, email = ?, type = ?, regts = ?, dao_updated = ? WHERE id = ?; 
INSERT INTO account (id, name, email, type, regts, dao_created,dao_updated) SELECT ?,?,?,?,?,?,? WHERE NOT EXISTS (SELECT 1 FROM account WHERE id = ? );

我收到错误消息:

Caused by: java.sql.SQLSyntaxErrorException: unexpected token: INSERT
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)

这是 hsqldb 的限制还是我做错了什么?

提前感谢莱昂

4

2 回答 2

0

您显然不能在单个executeUpdate()调用中使用多个语句。请,第一次打两次UPDATE,下次打INSERT

于 2013-01-08T23:25:17.833 回答
0

HSQLDB 为此支持 MERGE 语句:

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

合并语句通常比 UPSERT 和非标准替代方案更强大。

或者,您可以使用 CREATE PROCEDURE 并定义类似于链接答案中给出的 PostgreSQL 示例的过程。

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

您可以使用 GET DIAGNOSTICS 语句来确定更新是否成功。

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

于 2013-01-08T23:32:03.537 回答