1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLiteでテーブル作成時に制約をつける

Last updated at Posted at 2022-03-30

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

余談

  • version 3.37.0 (2021-11-27)から厳格な片付けモードのサポートが開始されたようです(ソース)。
  • ドキュメントにDECIMAL(数字,数字)と指定できることは書かれてあるのですが、指定によりどのような制約がかかるのか記載がありませんでした。書いても格納できるデータが変わらないという話がありました(参考1参考2)。なぜ実装されたのか謎です。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?