私は次のカウンターの表を持っています:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
カウンターの1つをインクリメントするか、対応する行がまだ存在しない場合はゼロに設定したいと思います。標準SQLで並行性の問題なしにこれを行う方法はありますか?操作はトランザクションの一部である場合もあれば、別個の場合もあります。
可能であれば、SQLはSQLite、PostgreSQL、MySQLで変更せずに実行する必要があります。
検索により、並行性の問題に悩まされているか、データベースに固有のアイデアがいくつか見つかりました。
INSERT
新しい行を試してUPDATE
、エラーが発生した場合。残念ながら、のエラーINSERT
は現在のトランザクションを中止します。UPDATE
INSERT
行。行が変更されていない場合は、新しい行。MySQLには
ON DUPLICATE KEY UPDATE
句があります。
編集:すべての素晴らしい返信をありがとう。ポールは正しいように見えますが、これを行うための単一のポータブルな方法はありません。それは非常に基本的な操作のように聞こえるので、それは私にとって非常に驚くべきことです。