今回の記事はSQLを扱う上で当たり前のことかと思いますが、データベースの「制約」に関してです。
データベースの制約とは
データベースにおいて、列定義にそれぞれ付与することができ、特定のデータパターンの挿入や更新を制限できる効果を持っています。
例えば、「IDは重複してほしくないよね」とか「名前は絶対入力してほしいよね」という要求に対して適した制約を設けることで、「重複したID」や「名前が空(NULL)」のデータを登録しようとしたときに制約によりエラーとすることができます。
制約を適切に使用することで、システムの意図に反したSQL文を弾くことができるので、人為的なミスの防止につながります。
本記事ではSQL Serverにおける制約を例に取って紹介させていただきます。制約は以下の6つとなります。
- NOT NULL制約
- UNIQUE制約
- PRIMARY KEY制約
- CHECK制約
- DEFAULT制約
- FOREIGN KEY制約
例えば、下記の列を持つ会社員テーブルというものを想定します。
社員ID | 氏名 | 性別 | 年齢 | 部署 |
NOT NULL制約
データを挿入するときにNULL(空)を許さない制約です。
社員IDや氏名、部署は絶対いるけど、性別と年齢は未記入もありにしよう!という方針であれば、「社員ID」、「氏名」、「部署」にNOT NULL制約を設けることで解決します。
UNIQUE制約
データの重複を許さない制約です。
先ほどの会社員テーブルを例にすると「社員ID」をUNIQUE制約にするのが順当です。同姓同名が存在しない場合であれば「名前」もUNIQUE制約をかけられるかもしれません。
PRIMARY KEY制約
主キー制約ともいいます。この制約は主キーとしての条件(重複不可、NOT NULL)を満たしているかどうかを判定し、満たさないデータを許さない制約です。
上記で説明したNOT NULL制約とUNIQUE制約の足し算とも言える制約です。またNOT NULL制約やUNIQUE制約とは違い、1つのテーブルにつき1つしか設定できません。
CHECK制約
データベースに追加する値が指定条件を満たすかどうかをチェックする制約です。
会社員テーブルを例にすると、年齢が16歳以上でないといけないというような使い方になります。
DEFAULT制約
データベースに値を追加する際に、値を入力しなかったときに予め指定しているデフォルト値を自動で追加する制約です。
この制約を用いると、指定した初期値が入ります。
FOREIGN KEY制約
外部キー制約とも言います。他のテーブルのカラムを外部キーに指定し、そのテーブルとの参照整合性を保つための制約です。
具体的には、
- 参照先にない値を参照元では追加できない
- 参照元で使用している値を参照先では削除できない
という制約を課します。
少し分かりにくいかと思いますので、先ほどまでの会社員テーブルと新たに部署テーブルを例に説明します。
会社員テーブル
社員ID | 氏名 | 性別 | 年齢 | 部署 |
---|---|---|---|---|
001 | 田中一郎 | 男 | 31 | 1 |
002 | 山田花子 | 女 | 28 | 2 |
003 | 鈴木太郎 | 男 | 25 | 1 |
部署テーブル
部署ID | 部署名 |
---|---|
1 | 営業部 |
2 | 経理部 |
3 | 商品開発部 |
会社員テーブルの部署に、部署テーブルの部署IDに向けた外部キー制約をかけています。
参照先にない値を参照元では追加できない
この制約は、会社員テーブルにて部署列に「4」を入れるような操作をするとエラーになる制約です。
参照先の部署IDに現段階で「4」はないので入力することができません。
参照元で使用している値を参照先では削除できない
部署テーブルの部署IDの「2」を削除しようとするとエラーとなります。
参照元の会社員テーブルにて「2」は使用されており、削除すると参照先が不明になるからです。部署ID「3」については現段階で使用されていないので、削除は可能となります。
テーブルのみならず、テーブル変数や一時テーブルなどにも制約を設定することができます。テーブル設計や変数の用い方を具体的にわかりやすく示すためにも、積極的に各種制約を利用することで品質/保守性の向上につなげています。
以上となります。ここまでご覧いただきありがとうございます。