【せいやく】

制約(データベース) とは?

💡 テーブルに設定する「データの品質を守るルール」
📌 このページのポイント
データベース制約の種類 employees(社員テーブル) id name email dept_id age 1 田中太郎 tanaka@ex D01 30 2 佐藤花子 sato@ex D02 25 🔑 PRIMARY KEY 一意 + NOT NULL NOT NULL 空値を禁止 UNIQUE 重複を禁止 FOREIGN KEY 親テーブル参照 CHECK age >= 18 departments D01 | 営業部 D02 | 開発部 制約 = ルール 不正データの挿入を防止 データ整合性を保証 CREATE TABLE で定義
データベース制約の種類
ひよこ ひよこ

制約って具体的にどんなものがあるの?

ペンギン先生 ペンギン先生

代表的なものは5つ。NOT NULL(空を禁止)、UNIQUE(重複を禁止)、PRIMARY KEY(NOT NULL + UNIQUE、行の識別子)、FOREIGN KEY(他テーブルへの参照整合性)、CHECK(値の範囲や条件を指定)。例えば「年齢は0以上150以下」みたいなCHECK制約を付けられるよ。

ひよこ ひよこ

制約がないとどうなるの?

ペンギン先生 ペンギン先生

不正なデータが入り放題になる。例えばNOT NULLがなければ名前が空のユーザーが作れるし、外部キー制約がなければ存在しないユーザーIDの注文データが入れられる。「アプリ側でチェックすればいい」と思うかもしれないけど、SQLを直接実行する管理ツールやバッチ処理からはアプリのチェックを通らないから、最後の砦として制約は重要なんだ。

ひよこ ひよこ

制約って後から追加・削除できるの?

ペンギン先生 ペンギン先生

ALTER TABLEで追加・削除できるよ。ただし既存データが制約に違反していると追加に失敗する。例えばNULLが入っているカラムにNOT NULL制約を付けようとするとエラーになるから、先にNULLのデータを修正する必要がある。

ひよこ ひよこ

制約をたくさん付けるとパフォーマンスに影響する?

ペンギン先生 ペンギン先生

INSERT・UPDATE・DELETEのたびに制約チェックが走るから、多少は影響する。特に外部キー制約は参照先テーブルを確認するので影響が大きめ。大量データの一括インポート時に外部キー制約を一時的に無効化するテクニックもあるけど、無効化中にデータ不整合が入るリスクがあるから「制約を外した状態でデータを入れて、最後に再有効化してチェックする」という手順を守る必要がある。この判断は本番環境だとかなり慎重にやらないといけないんだよね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
制約って出てきたら「テーブルに設定する、おかしなデータを入れさせないためのルール」と思えばだいたいOK!
📖 おまけ:英語の意味
「Constraint」 = 制約・制限
💬 英語の「constraint(制約する)」そのまま。データに制限をかけて品質を守るイメージ
← 用語集にもどる