1. ホーム
  2. mysql

[解決済み] テーブルの行をUPDATEしたり、存在しない行をINSERTするにはどうすればよいのでしょうか?

2023-04-22 20:13:08

質問

次のようなカウンタの表があります。

CREATE TABLE cache (
    key text PRIMARY KEY,
    generation int
);

カウンタの1つをインクリメントするか、対応する行がまだ存在しない場合は0に設定したいと思います。標準SQLで並行処理の問題を起こさずにこれを行う方法はありますか? この操作はトランザクションの一部であったり、別々であったりします。

SQLは、可能であれば、SQLite、PostgreSQL、MySQL上で変更されずに実行されなければなりません。

検索すると、並行処理の問題に苦しむか、データベースに特化したいくつかのアイデアが見つかりました。

  • 以下を試してみてください。 INSERT で新しい行を作成し UPDATE である。残念ながら、このエラーは INSERT でのエラーは現在のトランザクションを中止させます。

  • UPDATE 行が変更されていない場合は INSERT は新しい行となります。

  • MySQL は ON DUPLICATE KEY UPDATE 節を持つ。

EDIT: すべての素晴らしい返信をありがとうございました。Paul の言うとおりで、これを行うための単一のポータブルな方法はないようです。これは非常に基本的な操作のように思えるので、私にとってはかなり驚きです。

どのように解決するのですか?

MySQL (そしてその後 SQLite) も REPLACE INTO 構文をサポートしています。

REPLACE INTO my_table (pk_id, col1) VALUES (5, '123');

これは自動的に主キーを識別し、更新するために一致する行を見つけ、何も見つからなければ新しいものを挿入します。

ドキュメンテーション https://dev.mysql.com/doc/refman/8.0/en/replace.html