【メモ】sqlite3のUPSERTを試してみた
環境
Windows 10 Pro 64bit
sqlite3
PowerShell 5.1.18362.752
概要
このたびSQLite
を触る機会があり、リファレンスを眺めているとupsertがあったので試してみた。
調べたところ、二種類あるみたいで
ON CONFLICT
を使って条件分岐させるものと
REPLACE INTO
を使って置換させるものの二種類があることがわかった。
試してみたコマンド等
とりあえず適当にテーブルを作って初期データのINSERT。
C:\hoge> sqlite3 hoge sqlite> create table user(id integer, name text, description text, primary key(id, name)); sqlite> insert into user (1, 'hoge', 'fuga');
まずはREPLACE INTO
から。
sqlite> replace into user values(2, 'hoge', 'fuga') sqlite> select * from user; 1|hoge|fuga 2|hoge|fuga sqlite> replace into user values(1, 'hoge', 'fugaaa') sqlite> select * from user; 2|hoge|fuga 1|hoge|fugaaa
なるほど、delete insert
なのか。
replace
っていうから、updateが流れてるのかと思ってた。
次はON CONFLICT
。
sqlite> insert into user values (2, 'hoge', 'hogefuga') on conflict(id, name) do update set description = 'fugafuga'; sqlite> select * from user; 2|hoge|fugafuga 1|hoge|fugaaa
こっちはまぁ予想通りというか、分岐してupdate文発行してるので
期待通りの結果になった感じ。
終わりに
場合によって二つを使い分ける感じかなと思いました。
すっきりかけるのは前者だけど、条件分けして色んなことをするなら後者かなぁ。
現場からは以上です。