1

次の hsqldb テーブルがあり、UUID を自動インクリメント ID にマップします。

SHORT_ID (BIG INT, PK, auto incremented) | UUID (VARCHAR, unique)

コマンドを作成します。

CREATE TABLE mytable (SHORT_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, UUID VARCHAR(36) UNIQUE)

新しいペアを同時に追加するには、atomicMERGE INTOステートメントを使用します。したがって、私の(準備された)ステートメントは次のようになります。

MERGE INTO mytable USING (VALUES(CAST(? AS VARCHAR(36)))) AS v(x) ON mytable.UUID = v.x WHEN NOT MATCHED THEN INSERT VALUES v.x

ステートメントを実行すると(プレースホルダーを正しく設定すると)、常に

Caused by: org.hsqldb.HsqlException: row column count mismatch

ここで何がうまくいかないのか、ヒントを教えてください。

前もって感謝します。

4

2 に答える 2

2

エピローグ

この動作をバグとして報告し、 hsqldb-Bugs-2989597 に従って、今日 (2010-05-25) hsqldb SVN リポジトリで修正されました。(ありがとう、hsqldb!)

更新された回答

きちんとしたもの!HSQLDB 2.0.0rc9これは、投稿した構文とエラーメッセージをサポートする の下で作業する必要があるものです。

MERGE INTO mytable
   USING (SELECT 'a uuid' FROM dual) AS v(x) -- my own "DUAL" table
   ON (mytable.UUID = v.x)
   WHEN NOT MATCHED THEN INSERT
     VALUES (NULL, x)                        -- explicit NULL for "SHORT_ID" :(

2.0.0rc9 に を受け入れるよう説得できなかっ... THEN INSERT (UUID) VALUES (x)たことに注意してください。これは、IIUC が完全に受け入れられ、上記よりも明確な仕様です。(私の SQL の知識は大したものではありませんが、これは私にはバグのように見えます。)

元の回答

複数の列を持つテーブルに単一の値 (1 タプル) を INSERT しているようです。おそらく、ステートメントの最後を次のように変更できます。

... 一致しない場合は ("UUID") 値を挿入 (vx)

于 2010-04-16T19:18:03.533 に答える
-1

同じ問題が発生しましたが、数分で解決します。

データ値とテーブル構造が同じでない場合に発生します。空の列の値に明示的な (NULL) を追加します。

テーブルを作成したように

テストケース テーブル:

ID テストケースID 説明

ただし、挿入ステートメントでテストケースの説明に説明を追加したくない場合は、説明にnull値を設定する必要がある挿入ステートメントで明示する必要があります

于 2013-10-01T10:15:17.413 に答える