SQLiteで制約の付け方がわかりづらかったので備忘も兼ねて書きます。
制約をつける
主要な制約を全部入れるとこんな感じ。
CREATE TABLE table1(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL DEFAULT '' CHECK(name IN ('hoge', 'fuga')),
param1 TEXT UNIQUE,
param2 INTEGER REFERENCES table2(id)
);
NOT NULL、PRIMARY KEY、DEFAULTはそこまま書くだけです。
注意が必要な項目だけ解説します。
AUTOINCREMENT
MySQLだとAUTO_INCREMENTですがアンダーバーなしのAUTOINCREMENTで指定します。遅くなるので必要なければ付与しないことが推奨されています(ソース)。
CHECK
CHECK(条件)で指定します。条件は
カラム名 IN ('hoge', 'fuga')
や、カラム:名 < 100
のように指定します。
ユニーク制約
カラム単位ではUNIQUEをつけるだけでOK。
複数カラムでユニークにしたいときは、Create文の最後にUNIQUE ({カラム名1}, {カラム名2})
をつけます。
外部キー制約
まずは下クエリを実行して有効化する必要があります。有効化しなくても一応制約は登録されてますが、違反してもエラーが出ず登録できてしまいます。互換性の関係で初期設定がオフになっているらしいです(ソース)。
pragma foreign_keys = ON;
パラメータの指定方法はこの記事が分かりやすいです。
SQLite3構文 列制約(foreign key references)
その他注意点
- 基本的に順不同ですが、AUTOINCREMENTはPRIMARY KEYの後など、一部ルールがあったりします。こちらが参考になります。
- 既存のテーブルに制約をつけたい場合、SQLiteでは後から制約を付与する機能はないようで、新しくテーブルを作り直す必要があるようです。試せてないですが下記記事が参考になりそうです。
SQLite: Unique Constraints