Categories: データベース

SQLite制約の基礎と使い方:PRIMARY KEY・UNIQUE・NOT NULL・FOREIGN KEYを徹底解説

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を使いこなす上での助けになれば幸いです。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。