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