なんもわかってなかったと気付く。
対象環境
きっかけ
偶然こちらで表制約の存在をはじめて知った。こんな基本的なことすら知らなかったことにショック。
たとえば
create table if not exists MyTable( id int primary key, age int, name text, constraint c1 check((0<=age and age>=200) and (name='A' or name='B')) );
以下2つを知らなかった。
if not existsconstraint
反省
今までネットで見たコードを適当にコピペして理解したつもりになっていた。別に今まで困らなかったから、と思っていたが、if not existsを知らないがゆえにdrop tableしてからcreate tableとかやってた。いや、結果的にそれでいいのかもしれないが、良し悪しを判断する以前に、そもそも知らなかったのが問題。いかん。これはいかん。
そこで、ちゃんと資料を読むことにする。読んでなかったからわかってなくて当然だった。
資料
SQLite3の公式資料と思われる。まずはこれをザッと順に流し読み。
構文なら上記か。これを読めばSQLを書けるようになりそう。
リリース一覧。最新機能を知れる。
いずれにせよ英文なので、自動翻訳しながら読むことになる。
非実装機能
| 項目 | 実装済み | 非実装 |
|---|---|---|
| 外部結合 | LEFT OUTER JOIN |
RIGHT OUTER JOIN(FULL OUTER JOIN) |
ALTER TABLE |
RENAME TABLE, ADD COLUMN, RENAME COLUMNのみ |
DROP COLUMN,ALTER COLUMN,ADD CONSTRAINT等ほぼ全て |
| トリガー | FOR EACH ROW |
FOR EACH STATEMENT |
| ビュー書込 | DELETE,INSERT,UPDATE時に起動するトリガーで実行 |
ビューに対してDELETE,INSERT,UPDATEできない |
GRANT,REVOKE |
無意味のため非実装 | 無意味のため非実装 |
SQLite3はファイルベースである。その上、軽量である。だが機能は少ない。
SQLキーワード
SQL構文を俯瞰できる。ザッと目を通す。
たとえばSELECTのようなキーワードがある。たしかSQLは大文字小文字を区別しない。なのでselectもsElectもキーワードのはず。
キーワード一覧
ABORTACTIONADDAFTERALLALTERANALYZEANDASASCATTACHAUTOINCREMENTBEFOREBEGINBETWEENBYCASCADECASECASTCHECKCOLLATECOLUMNCOMMITCONFLICTCONSTRAINTCREATECROSSCURRENTCURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPDATABASEDEFAULTDEFERRABLEDEFERREDDELETEDESCDETACHDISTINCTDODROPEACHELSEENDESCAPEEXCEPTEXCLUDEEXCLUSIVEEXISTSEXPLAINFAILFILTERFOLLOWINGFORFOREIGNFROMFULLGLOBGROUPGROUPSHAVINGIFIGNOREIMMEDIATEININDEXINDEXEDINITIALLYINNERINSERTINSTEADINTERSECTINTOISISNULLJOINKEYLEFTLIKELIMITMATCHNATURALNONOTNOTHINGNOTNULLNULLOFOFFSETONORORDEROTHERSOUTEROVERPARTITIONPLANPRAGMAPRECEDINGPRIMARYQUERYRAISERANGERECURSIVEREFERENCESREGEXPREINDEXRELEASERENAMEREPLACERESTRICTRIGHTROLLBACKROWROWSSAVEPOINTSELECTSETTABLETEMPTEMPORARYTHENTIESTOTRANSACTIONTRIGGERUNBOUNDEDUNIONUNIQUEUPDATEUSINGVACUUMVALUESVIEWVIRTUALWHENWHEREWINDOWWITHWITHOUT
キーワードを使う
キーワードを識別子として使うときはダブルクォートで囲む。
select id, "select" from MyTable;
文字リテラルとするときはシングルクォートで囲む。
insert into MyTable values(1, 'insert');
引用符
SQLite3で使う引用符は4種類ある。
| 引用符 | 概要 |
|---|---|
'' |
文字列リテラル |
"" |
識別子 |
[] |
非SQL標準。MS AccessとSQL Serverとの互換性のため。スペースは-で置き換える。 |
`` |
非SQL標準。MySQLとの互換性のため。 |
上2つだけ使うほうがシンプルで良い。
気になる機能
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux