やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

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すら削除される。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux