制約
制約を使用すると、データベース エンジンにより自動的にデータベースの整合性を保つ方法を定義できます。制約は、列で許容される値に関するルールを定義するもので、整合性を保つための標準メカニズムです。制約は、DML トリガ、ルール、およびデフォルトよりも頻繁に使用されます。クエリ オプティマイザも制約定義を使用してパフォーマンスの高いクエリ実行プランを構築します。
制約のクラス
SQL Server では、次の制約のクラスがサポートされます。
NOT NULL は、列で NULL 値が許容されないことを指定します。詳細については、「NULL 値の許容」を参照してください。
CHECK 制約は、列に格納できる値を制限することによってドメイン整合性を確保します。詳細については、「CHECK 制約」を参照してください。
CHECK 制約は、論理検索条件を指定します (TRUE、FALSE、または不明のいずれかに評価されます)。この条件は、その列に入力されるすべての値に適用されます。結果が FALSE に評価される値は、すべて拒否されます。1 つの列には複数の CHECK 制約を指定できます。次の例では、chk_id という制約を作成しています。この制約は、指定された範囲の数値だけが主キーに入力されるようにすることで、主キーの範囲をさらに限定しています。
CREATE TABLE cust_sample ( cust_id int PRIMARY KEY, cust_name char(50), cust_address char(50), cust_credit_limit money, CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 ) )
UNIQUE 制約は、一連の列内の値が一意になることを保証します。
UNIQUE 制約では、1 つのテーブル内で複数の行に同じ列値を格納することはできません。主キーでも一意性が保証されますが、主キーでは NULL を一意の値とすることはできません。詳細については、「UNIQUE 制約」を参照してください。
PRIMARY KEY 制約は、テーブル内の行を一意に識別する値を含む列または列セットを指定する制約です。詳細については、「PRIMARY KEY 制約」を参照してください。
あるテーブル内の複数の行が同じ主キー値を持つことはできません。主キーの列に NULL を入力することはできません。主キーには small 型や integer 型の列を使用することをお勧めします。1 つのテーブルに 1 つずつ、主キーを設定してください。主キーとして使用できる列または列の組み合わせを、候補キーと呼びます。
次の例では、part_sample というテーブルを作成し、part_nmbr フィールドを主キーに指定しています。
CREATE TABLE part_sample (part_nmbr int PRIMARY KEY, part_name char(30), part_weight decimal(6,2), part_color char(15) );
FOREIGN KEY 制約は、テーブル間の関係を特定し、これを保証します。詳細については、「FOREIGN KEY 制約」を参照してください。
あるテーブルの外部キーは、別のテーブルの候補キーを指します。次の例では、order_part というテーブルを作成し、前の例で定義した part_sample テーブルを参照する外部キーを設定しています。
CREATE TABLE order_part (order_nmbr int, part_nmbr int FOREIGN KEY REFERENCES part_sample(part_nmbr) ON DELETE NO ACTION, qty_ordered int); GO
NULL を除く外部キー値を含む行を挿入できるのは、その値を備えた候補キーが存在する場合だけです。ON DELETE 句は、既存の外部キーが指している行を削除しようしたときに実行する動作を制御します。ON DELETE 句には、次のオプションがあります。
NO ACTION を指定すると、削除に失敗し、エラーが発生します。
CASCADE を指定すると、削除される行を指している外部キーを含むすべての行が削除されます。
SET NULL を指定すると、削除される行を指している外部キーを含むすべての行が NULL に設定されます。
SET DEFAULT を指定すると、削除される行を指している外部キーを含むすべての行がそれぞれの既定値に設定されます。詳細については、「既定値」を参照してください。
ON UPDATE 句は、既存の外部キーが指している候補キーの値を更新しようとしたときに実行する動作を定義します。この句も、NO ACTION、CASCADE、SET NULL、および SET DEFAULT の各オプションをサポートします。
列制約とテーブル制約
制約は、次のように列制約とテーブル制約に分類できます。列制約は、列定義の一部として指定し、その列だけに適用されます。前の例の制約は、いずれも列制約です。テーブル制約は列定義とは別に宣言され、1 つのテーブル内の複数の列に適用できます。テーブル制約は、1 つの制約の中に複数の列を含める場合に使用する必要があります。
たとえば、テーブルの主キー内に 2 つ以上の列を含める場合、テーブル制約を使用して両方の列を主キーに含める必要があります。ある工場のコンピュータで発生するイベントを記録するテーブルを考えてみましょう。いくつかの種類のイベントが同時に発生する可能性がありますが、同時に発生する 2 つのイベントは同じ種類にならないものとします。この場合、次の例のように、主キーに event_type 列と event_time 列の 2 列を含めることで、この条件をテーブルに設定できます。
CREATE TABLE factory_process
(event_type int,
event_time datetime,
event_site char(50),
event_desc char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )