1

この素晴らしい投稿に従ってアップサートを実装していました: 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初回は2回、次回は2回お電話くださいINSERT

于 2013-01-08T23:25:17.833 に答える
0

HSQLDB は、このために MERGE ステートメントをサポートしています。

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

通常、merge ステートメントは、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 に答える