やってみる

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

SQLite3構文 update

 データの更新。

成果物

一覧

update set

create table T(A text);
insert into T values('A');
update T set A='B';
select * from T;
B

update set () = ()

 SQLite3.15.0以降、列名リスト行値をセットできる。

create table T(A integer, B text);
insert into T values(1,'A');
update T set (A,B)=(2,'B');
select * from T;
2|B

update set where

create table T(A text);
insert into T values('A');
insert into T values('B');
update T set A='C' where rowid=1;
select * from T;
C
B

conflict

rollback

 制約違反のとき、更新せずロールバックする。

create table T(A text check(length(A)=1));
insert into T values('A');
insert into T values('B');
update or rollback T set A='AA' where rowid=1;
select * from T;
Error: CHECK constraint failed: T
A
B

abort

 制約違反のとき、更新せず中止して取り消す。

create table T(A text check(length(A)=1));
insert into T values('A');
insert into T values('B');
update or abort T set A='AA' where rowid=1;
select * from T;
Error: CHECK constraint failed: T
A
B

replace

 not null制約違反でdefaultがないとき、abortと同じ。

create table T(A text not null);
insert into T values('A');
insert into T values('B');
update or replace T set A=NULL where rowid=1;
select * from T;
Error: NOT NULL constraint failed: T.A
A
B

 not null制約違反でdefaultがあるとき、default値に置き換える。

create table T(A text not null default 'DEF');
insert into T values('A');
insert into T values('B');
update or replace T set A=NULL where rowid=1;
select * from T;
Error: NOT NULL constraint failed: T.A
DEF
B

 check制約違反のとき、abortと同じ。

create table T(A text check(length(A)=1));
insert into T values('A');
insert into T values('B');
update or replace T set A='AA' where rowid=1;
select * from T;
Error: CHECK constraint failed: T
A
B

 外部キー制約違反のとき、abortと同じ。

create table U(id integer primary key);
insert into U values(1);
insert into U values(2);
create table T(A integer references U(id));
insert into T values(1);
insert into T values(2);
update or replace T set A=0 where A=1;
select * from T;
Error: FOREIGN KEY constraint failed
1
2

fail

 制約違反が起こると中止する。その前までのはロールバックしない。それ以降は実行しない。

create table T(A text check(length(A)=1));
insert into T values('A');
insert into T values('B');
update or fail T set A='AA' where rowid=1;
select * from T;
Error: CHECK constraint failed: T
A
B

 でも、or failを付与したステートメントのみ対象っぽい。トランザクション全体が中止されるわけではないようだ。

create table T(A text check(length(A)=1));
begin;
insert into T values('A');
insert into T values('B');
update or fail T set A='AA' where rowid=1;
insert into T values('C');
end;
select * from T;
Error: CHECK constraint failed: T
A
B
C

ignore

 制約違反が起こると無視する。エラーも出ない。

create table T(A text check(length(A)=1));
insert into T values('A');
insert into T values('B');
update or ignore T set A='AA' where rowid=1;
select * from T;
A
B

order by limit offset

create table T(A text, B text);
insert into T values('B','B');
insert into T values('D','D');
insert into T values('A','A');
insert into T values('C','C');

 A列を昇順にして先頭から1つ目を飛ばし、1件だけ更新。

update T 
  set A='Z' 
  order by A 
  limit 1 offset 1;
select * from T order by A;
A|A
C|C
D|D
Z|B

 A列の値がBのセルをZ値に更新した。

対象環境

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

前回まで