http://en.wikipedia.org/wiki/Upsert
SQLiteでこれを行うために私が考えていなかった賢い方法はありますか?
基本的に、レコードが存在する場合は4つのカラムのうち3つを更新します。レコードが存在しない場合は、4番目のカラムのデフォルト(NUL)値でレコードを挿入します。
IDは主キーであるため、UPSERTへのレコードは1つしかありません。
(明らかに更新または挿入する必要があるかどうかを判断するために、SELECTのオーバーヘッドを回避しようとしています)
提案?
SQLiteサイトでTABLE CREATEの構文を確認できません。テスト用のデモは作成していませんが、サポートされていないようです。
もしそうなら、私は3つの列を持っているので、実際には次のようになります:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
ただし、最初の2つのblobは競合を引き起こさず、IDのみが発生するので、(必要に応じて)Blob1とBlob2は置き換えられません。
バインドデータが完全なトランザクションである場合のSQLiteでのUPDATEは、更新される送信された各行に以下が必要であることを意味します。
ステートメントオブジェクトの寿命は次のようになります。
- sqlite3_prepare_v2()を使用してオブジェクトを作成します
- sqlite3_bind_インターフェイスを使用して値をホストパラメータにバインドします。
- sqlite3_step()を呼び出してSQLを実行します
- sqlite3_reset()を使用してステートメントをリセットし、手順2に戻って繰り返します。
- sqlite3_finalize()を使用してステートメントオブジェクトを破棄します。
UPDATE INSERTに比べて遅いと思いますが、主キーを使用したSELECTと比較するとどうですか?
おそらく、selectを使用して4番目の列(Blob3)を読み取り、REPLACEを使用して、元の4番目の列と最初の3列の新しいデータをブレンドした新しいレコードを書き込む必要がありますか?