なんもわかってなかったと気付く。
対象環境
きっかけ
偶然こちらで表制約の存在をはじめて知った。こんな基本的なことすら知らなかったことにショック。
たとえば
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 exists
constraint
反省
今までネットで見たコードを適当にコピペして理解したつもりになっていた。別に今まで困らなかったから、と思っていたが、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
もキーワードのはず。
キーワード一覧
ABORT
ACTION
ADD
AFTER
ALL
ALTER
ANALYZE
AND
AS
ASC
ATTACH
AUTOINCREMENT
BEFORE
BEGIN
BETWEEN
BY
CASCADE
CASE
CAST
CHECK
COLLATE
COLUMN
COMMIT
CONFLICT
CONSTRAINT
CREATE
CROSS
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATABASE
DEFAULT
DEFERRABLE
DEFERRED
DELETE
DESC
DETACH
DISTINCT
DO
DROP
EACH
ELSE
END
ESCAPE
EXCEPT
EXCLUDE
EXCLUSIVE
EXISTS
EXPLAIN
FAIL
FILTER
FOLLOWING
FOR
FOREIGN
FROM
FULL
GLOB
GROUP
GROUPS
HAVING
IF
IGNORE
IMMEDIATE
IN
INDEX
INDEXED
INITIALLY
INNER
INSERT
INSTEAD
INTERSECT
INTO
IS
ISNULL
JOIN
KEY
LEFT
LIKE
LIMIT
MATCH
NATURAL
NO
NOT
NOTHING
NOTNULL
NULL
OF
OFFSET
ON
OR
ORDER
OTHERS
OUTER
OVER
PARTITION
PLAN
PRAGMA
PRECEDING
PRIMARY
QUERY
RAISE
RANGE
RECURSIVE
REFERENCES
REGEXP
REINDEX
RELEASE
RENAME
REPLACE
RESTRICT
RIGHT
ROLLBACK
ROW
ROWS
SAVEPOINT
SELECT
SET
TABLE
TEMP
TEMPORARY
THEN
TIES
TO
TRANSACTION
TRIGGER
UNBOUNDED
UNION
UNIQUE
UPDATE
USING
VACUUM
VALUES
VIEW
VIRTUAL
WHEN
WHERE
WINDOW
WITH
WITHOUT
キーワードを使う
キーワードを識別子として使うときはダブルクォートで囲む。
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