やってみる

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

SQLite3構文 delete

 レコード削除。

成果物

情報源

一覧

delete from

0.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
delete from T;
select count(*) from T;

delete from where

1.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
delete from T where A = 0;
select * from T;

with delete from

 サブクエリ。

2_0.sql

create table T(A integer);
create table U(A integer);
insert into T values(0);
insert into T values(1);
insert into U values(0);

select count(*) from T;
with 
  del0 as (select 1),
  del1 as (select 2 union select * from del0)
delete from T where A in (select * from del1);
select count(*) from T;
2
1

 再帰クエリ。

2_1.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
insert into T values(9);

with recursive
  dels(x) as (values(1) union all select x+1 from dels where x<10)
delete from T where A in (select * from dels);
select * from T;
0

delete from order by

3_0.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
delete from T where A > 1 order by asc;
select * from T;
Error: near line 4: near "order": syntax error

 SQLite_ENABLE_UPDATE_DELETE_LIMITコンパイルオプションを有効にする必要があるらしい。さもなくば上記のようにエラーになる。

 というか、並び替えて削除とか意味あるの? 後述のlimitと合わせると意味あるだろうが、limit削除する要件とは? 日時順にソートして古いものから5件を上限に削除するとか? またはソート順を逆にしてoffsetを使うことで、最新5件を残してそれ以前を削除とか。

delete from limit

3_1.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
delete from T where A > 1 limit 5;
select * from T;
Error: near line 4: near "limit": syntax error

delete from limit offset

3_2.sql

create table T(A integer);
insert into T values(0);
insert into T values(1);
delete from T where A > 1 limit 5 offset 1;
select * from T;
Error: near line 4: near "limit": syntax error

 先頭から1レコードを飛ばす。やはりこれもエラー。

所感

 ビルドしなおして再挑戦しよう。

対象環境

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

前回まで