MySQLとHSQLDBの両方でサポートされている唯一の解決策は、置き換える予定の行をクエリし、条件付きでINSERTまたはUPDATEを実行することです。これは、RDBMS実装間の違いを補うために、より多くのアプリケーションコードを作成する必要があることを意味します。
- トランザクションを開始します。
- SELECT ...FORUPDATE。
- SELECTで行が見つかった場合は、UPDATEします。
- それ以外の場合は、挿入します。
- コミット。
MySQLはANSISQLMERGEステートメントをサポートしていません。 REPLACEおよびINSERT...ON DUPLICATEKEYUPDATEをサポートします。 "に対する私の回答をご覧ください。 INSERTIGNORE」と「INSERT...ONDUPLICATEKEYUPDATE」 詳細については。
コメントについて:はい、別のアプローチは、INSERTを試して、成功するかどうかを確認することです。それ以外の場合は、UPDATEを実行します。 INSERTを試行して重複キーをヒットすると、エラーが生成され、一部のクライアントインターフェイスでは例外になります。 MySQLでこれを行うことの欠点は、INSERTが失敗した場合でも新しい自動インクリメントIDを生成することです。だからあなたはギャップになってしまいます。自動インクリメントシーケンスのギャップは通常心配することではないことは知っていますが、この効果のために成功した挿入の間に1000〜1500のギャップがあった昨年の顧客を支援し、その結果、主キーのINT。
@barakyが言うように、代わりに最初にUPDATEを試行し、それがゼロ行に影響する場合は、代わりにINSERTを実行することができます。この戦略に関する私のコメントは、ゼロ行の更新も例外ではないということです。更新後に「影響を受ける行数」をチェックして、「成功」したかどうかを確認する必要があります。
ただし、影響を受ける行数をクエリすると、元の問題に戻ります。MySQLとHSQLDBでは異なるクエリを使用する必要があります。
HSQLDB:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();