end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

sqlite3 での upsertは「REPLACE INTO」or「INTERT INTO ~ ON ON CONFLICT」

参考url

sqlite3のバージョン確認と、テストテーブル、テストデータ作成

$ /usr/bin/sqlite3 test.db

sqlite> select sqlite_version();
3.26.0

sqlite> CREATE TABLE test_tbl(id   INTEGER PRIMARY KEY,
                              name TEXT UNIQUE,
                              age  INTEGER);
sqlite> .schema test_tbl 
CREATE TABLE test_tbl(id   INTEGER PRIMARY KEY,
                              name TEXT UNIQUE,
                              age  INTEGER);
                  
sqlite> INSERT INTO test_tbl(id, name, age) values(1, 'Sato', 10);

通常のINSERTによるコンフリクト エラー

sqlite> INSERT INTO test_tbl(id, name, age) values(1, 'Sato', 10);
Error: UNIQUE constraint failed: test_tbl.id

「REPLACE INTO」によるUPSERT

The ON CONFLICT Clause によれば 「REPLACE INTO」の実体は「INSERT OR REPLACE」へのエイリアスのようです

sqlite> REPLACE INTO test_tbl(id, name, age) values(1, 'Sato2', 20);

「INTERT INTO ~ ON ON CONFLICT」によるUPSERT

The ON CONFLICT Clause

sqlite> INSERT INTO test_tbl(id, name, age) values(4, 'Tanaka', 30)
          ON CONFLICT(id) DO UPDATE SET name='Tanaka2', age=age+60;