SQLiteは軽量で手軽に使えるデータベースとして人気がありますが、正確で信頼性の高いデータ管理を行うためには「制約」の理解が不可欠です。制約は、テーブルに保存されるデータの一貫性や正確性を保つルールです。この記事では、SQLiteでよく使われる4つの制約――PRIMARY KEY、UNIQUE、NOT NULL、FOREIGN KEY――について、それぞれの意味と使い方、注意点を詳しく解説します。初心者にもわかりやすく、実例付きで説明していきますので、SQLiteを使いこなしたい方はぜひ参考にしてください。
PRIMARY KEY(主キー)とは
PRIMARY KEYの意味
PRIMARY KEYは、テーブルの中で各行を一意に識別するための列、または列の組み合わせに設定される制約です。このキーは、他の行と重複しないようにするために、自動的に「NOT NULL」かつ「UNIQUE」の性質も持ちます。
使用例
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT
);
この例では、「id」列が主キーとなり、各ユーザーに一意なIDが割り当てられます。
注意点
- SQLiteでは、
INTEGER PRIMARY KEY
とすると自動で連番が付与されます(オートインクリメントのように動作)。 - テーブルには1つしかPRIMARY KEYを設定できません。
UNIQUE制約とは
UNIQUEの意味
UNIQUE制約は、その列に入力される値がすべてユニーク(重複なし)であることを保証するものです。PRIMARY KEYと異なり、NULLを許容する場合があります(ただしNULLは複数行に許可される)。
使用例
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email TEXT UNIQUE
);
この例では、email列に重複するメールアドレスが登録されないように制限されています。
注意点
- UNIQUE制約は複数列をまとめて設定することも可能です。
CREATE TABLE reservations (
room_id INTEGER,
date TEXT,
UNIQUE(room_id, date)
);
この例では、同じ部屋に同じ日に複数の予約を入れることが防がれます。
NOT NULL制約とは
NOT NULLの意味
NOT NULL制約は、その列にNULL値を入れることを禁止する制約です。必ず何らかの値が入力されることを保証します。
使用例
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price REAL NOT NULL
);
この例では、商品名と価格は必須項目として設定されています。NULLを入れようとするとエラーになります。
注意点
- デフォルトでは列はNULLを許容するため、NOT NULLが必要な場合は明示的に指定する必要があります。
- PRIMARY KEYに設定された列は自動的にNOT NULLになりますが、明示しても構いません。
FOREIGN KEY(外部キー)とは
FOREIGN KEYの意味
FOREIGN KEY制約は、あるテーブルの列が、別のテーブルの列と関連づけられていることを保証します。これにより、参照整合性(リファレンシャル・インテグリティ)を保つことができます。
使用例
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id)
);
この例では、「orders」テーブルの「user_id」列は、「users」テーブルの「id」列を参照しています。
注意点
- SQLiteでは、FOREIGN KEY制約を有効にするために明示的に設定が必要です。
sqlコピーする編集するPRAGMA foreign_keys = ON;
- 親テーブルのデータが削除された場合の動作を制御するために、「ON DELETE CASCADE」などのオプションが利用できます。
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE
);
このように設定することで、ユーザーが削除された場合、そのユーザーの注文も同時に削除されます。
制約を組み合わせて使う
実際のテーブル設計では、これらの制約を組み合わせることが一般的です。
CREATE TABLE employees (
employee_id INTEGER PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
department_id INTEGER NOT NULL,
FOREIGN KEY(department_id) REFERENCES departments(id)
);
この例では、従業員IDが主キー、メールアドレスが一意かつ必須、部門IDが外部キーとして設定されています。
制約違反が発生したときのエラーメッセージ
SQLiteでは、制約違反が起きると以下のようなエラーが表示されます。
- PRIMARY KEY違反:
UNIQUE constraint failed: table.column
- UNIQUE違反:
UNIQUE constraint failed: table.column
- NOT NULL違反:
NOT NULL constraint failed: table.column
- FOREIGN KEY違反:
FOREIGN KEY constraint failed
開発時はこれらのエラーを確認して、データが適切に扱われているか検証することが大切です。
まとめ
SQLiteの制約は、データベースの信頼性と整合性を維持するために欠かせない要素です。この記事で紹介したPRIMARY KEY、UNIQUE、NOT NULL、FOREIGN KEYの各制約を正しく使うことで、安全で効率的なデータ管理が可能になります。特に複数のテーブルを扱う場合やユーザー入力が絡むシステムでは、これらの制約を適切に設計段階で取り入れることが、トラブルを未然に防ぐ第一歩となります。
SQLiteはシンプルながらも強力な機能を備えており、制約をうまく活用すれば、より堅牢なアプリケーションの構築が可能です。今回の解説が、SQLiteを使いこなす上での助けになれば幸いです。