SQLite3でinsert or ignore selectしてみる
使えるのか。どうなるのか。
成果物
情報源
insert into ... select ...
文のときのコンフリクトについては書いてなかった。
コード
ignore
a.sql
create table T(A text unique); insert or ignore into T select 'A' union all select 'B' union all select 'A' union all select 'C'; select * from T;
sqlite3 :memory: a.sql
A B C
重複するA
はスキップされる。エラー箇所は挿入されずエラーも出ない上、何事もなかったかのようにエラー以降のステートメントを実行する。
fail
b.sql
create table T(A text unique); insert or fail into T select 'A' union all select 'B' union all select 'A' union all select 'C'; select * from T;
sqlite3 :memory: b.sql
Error: near line 2: UNIQUE constraint failed: T.A A B
エラーが出た時点で中断。それ以降の重複しないC
は挿入されない。
rollback
c.sql
create table T(A text unique); insert or rollback into T select 'A' union all select 'B' union all select 'A' union all select 'C'; select * from T;
sqlite3 :memory: c.sql
Error: near line 2: UNIQUE constraint failed: T.A
エラーが出た時点でロールバック。最後のselect * from T;
でテーブル未定義エラーが出ないことから、insert ... select ...
文のみロールバックされたと思われる。エラーより前に成功したA
,B
すら削除される。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- Python 3.5.3
- SQLite 3.29.0 ※
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux