やってみる

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

SQLite3構文 delete(limit offset, order by)

 SQLiteでも使える。

成果物

前提

一覧

delete from limit *

create table T(A integer);
insert into T values(0);
insert into T values(1);
insert into T values(2);
delete from T limit 1;
.echo on
select count(*) from T;
select * from T;
select count(*) from T;
2
select * from T;
1
2

 最大で1件だけ削除する。つまり、3件中1件のみ削除されること。

 ただ、順序が不定のため、どの行が削除されるかわからない。A=0のレコードが削除されていることから、おそらくinsertした順(rowid昇順)か?

delete from limit * offset *

1_offset.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
insert into T values(2);
delete from T limit 1 offset 1;
.echo on
select count(*) from T;
select * from T;
select count(*) from T;
2
select * from T;
0
2

 先頭の1件を飛ばして1件だけ削除する。insert順であるならA=1のレコードが削除される。

delete from order by * limit *

2_orderby.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
insert into T values(2);
insert into T values(3);
insert into T values(4);
delete from T order by A desc limit 2;
.echo on
select count(*) from T;
select * from T;
select count(*) from T;
3
select * from T;
0
1
2

 2件削除された。降順にしたことから、削除対象になったのは末尾から2件のA=4,3レコードである。

delete from order by * limit * offset *

3_orderby_limitoffset.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
insert into T values(2);
insert into T values(3);
insert into T values(4);
delete from T order by A desc limit 2 offset 1;
.echo on
select count(*) from T;
select * from T;
select count(*) from T;
3
select * from T;
0
1
4

 2件削除された。また、降順にしたため、末尾のA=4レコードを1つ飛ばしてA=3,2レコードが削除された。

delete from where * order by * limit * offset *

4_where_orderby_limitoffset.sql

create table T(A integer);
insert into T values(4);
insert into T values(3);
insert into T values(2);
insert into T values(1);
insert into T values(0);
delete from T where 0 < A order by A asc limit 9 offset 1;
.echo on
select count(*) from T;
select * from T;
select count(*) from T;
2
select * from T;
1
0
  1. where句でA=0レコード以外のレコードが取得された。これでA=0は残る。
  2. さらにそれを昇順にソートし、1レコード分だけ飛ばす。これでA=1は残る。
  3. その他のレコードから9レコードだけ削除する。2,3,4の3レコードしかないため、それらすべて削除された。

所感

 SQLite3ではdelete文でlimit句を使えない、とか言ってる悪い子は誰じゃ? 使えるのじゃ! 以下のようにビルドせよ! ソースを信じるのじゃ!

対象環境

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

前回まで