http://en.wikipedia.org/wiki/Upsert
SQL Server に Update ストアド プロシージャを挿入する
私が考えていなかったSQLiteでこれを行う賢い方法はありますか?
基本的に、レコードが存在する場合は 4 つの列のうち 3 つを更新します。存在しない場合は、4 番目の列のデフォルト (NUL) 値でレコードを挿入します。
ID は主キーであるため、UPSERT の対象となるレコードは 1 つだけです。
(明らかにUPDATEまたはINSERTが必要かどうかを判断するために、SELECTのオーバーヘッドを回避しようとしています)
提案?
TABLE CREATE の SQLite サイトで Syntax を確認できませんでした。テスト用のデモを作成していませんが、サポートされていないようです。
もしそうなら、私は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 列の新しいデータをブレンドする新しいレコードを書き込む必要がありますか?