わしのlog

プログラミングとかバイクとか。

【メモ】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文発行してるので
期待通りの結果になった感じ。

終わりに

場合によって二つを使い分ける感じかなと思いました。
すっきりかけるのは前者だけど、条件分けして色んなことをするなら後者かなぁ。

現場からは以上です。