SQLiteでも使える。
成果物
前提
一覧
delete from limit *
delete from limit * offset *
delete from order by * limit *
delete from order by * limit * offset *
delete from where * order by * limit * offset *
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
where
句でA
=0
レコード以外のレコードが取得された。これでA
=0
は残る。- さらにそれを昇順にソートし、
1
レコード分だけ飛ばす。これでA
=1
は残る。 - その他のレコードから
9
レコードだけ削除する。2
,3
,4
の3レコードしかないため、それらすべて削除された。
所感
SQLite3ではdelete
文でlimit
句を使えない、とか言ってる悪い子は誰じゃ? 使えるのじゃ! 以下のようにビルドせよ! ソースを信じるのじゃ!
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- 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
前回まで
- SQLite3学習 俯瞰まとめ
- SQLite3学習 環境構築まとめ
- SQLite3学習 インタフェースまとめ(C言語、CLI、対話モード、Tcl...)
- SQLite3学習 ドットコマンドまとめ
- SQLite3学習 JSON拡張まとめ
- SQLite3学習 FTSまとめ(ICU, MeCab)
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 Geopoly(2次元ベクタ画像の生成)
- SQLite3学習 拡張関数(generate_series)
- SQLite3学習 拡張ライブラリ数学関数(extension-functions.c)
- SQLite3学習 謎と名前
- SQL文の分類(DDL,DML,TCL,DCL)
- SQL構文 alter(rename)
- SQL構文 alter(add column)概要
- SQL構文 alter(add column)制約
- SQL構文 alter(add column)sqlite_master変更しても反映されない
- SQL構文 alter(add column)スキーマ再定義(テーブル再作成による定義変更)
- SQL構文 analyze
- SQL構文 attach/detach
- SQLite3構文 begin,end,commit,rollback,savepoint(deferred,immediate,exclusive)
- SQLite3構文 コメント
- SQLite3構文 create/drop
- SQLite3構文 index(create/drop)
- SQLite3構文 table(create/drop)
- SQLite3構文 列制約(default)
- SQLite3構文 列制約(collate)
- SQLite3構文 列制約(primary key)
- SQLite3構文 列制約(primary key)ベストプラクティス
- SQLite3構文 列制約(unique)
- SQLite3構文 列制約(not null)
- SQLite3構文 列制約(check)
- SQLite3構文 列制約(foreign key references)
- SQLite3構文 表制約(primary key, unique, check, foreign key)
- SQLite3でメタデータを取得する方法(DB名(スキーマ名)、テーブル名、列名、制約)
- SQLite3でTEMPの保存先を指定する
- SQLite3構文 delete
- SQLite3ビルド失敗(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
- SQLite3をソースからビルドする(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)