SQL Server の CHECK 制約を作成する

SQL Server の CHECK 制約を作成する

前回 「SQL Server の制約」 で SQL Server の制約とは何かと、制約の種類について説明しました。

今回は、CHECK 制約を実際に作成してみましょう。

こちら のスクリプトを実行して、テーブルを再生成しておいてください。 全てのテーブルは使いませんが、これらのテーブルが存在している前提で進めます。


既存のテーブルに CHECK 制約を追加する

既存のテーブルのカラムに、CHECK 制約を追加するシンプルな構文は次の通りです。

ALTER TABLE [テーブル名] ADD CONSTRAINT [チェック制約名]
    CHECK ([条件文]);

[チェック制約名] は他のオブジェクトの名前とかぶらなければ何でも OK です。 私はだいたい CK_[テーブル名]_[関連するカラム名] などにしています。


CHECK 制約を追加した際は、デフォルトで既存のデータと、新規のデータの両方に制約が適用されます。

ですので、既存のデータが条件を満たしていない場合、CHECK 制約を追加する ALTER TABLE のスクリプトがエラーになり、CHECK 制約が生成できません。

どうしても、CHECK 制約を既存のデータに適用したくない時は、WITH NOCHECK オプションをテーブル名の後ろにつけて、ALTER TABLE [テーブル名] WITH NOCHECK ADD CONSTRAINT ... とすると、CHECK 制約が新規挿入データだけに適用されます。

ですが、後から見た時にどこから適用されているのか混乱を招きますし、オプティマイザーが CHECK 制約を活用できないので、できるだけ避けたほうがいいと思います。 (※マイクロソフトもおすすめしていません)

それでは、実際に CHECK 制約を追加してみましょう。 次のような Student テーブルがあります。

SQL Server の CHECK 制約を作成する 1
SQL Server の CHECK 制約を作成する 3

Gender (性別) カラムには M (male-男性)、F (female-女性) のどちらかの値しか入って欲しくないので CHECK 制約を追加します。


Gender が M か F しか入らないように Student テーブル に CHECK 制約を追加するスクリプトは以下の通りです。

ALTER TABLE Student ADD CONSTRAINT CK_Student_Gender
    CHECK (Gender IN ('M','F'));

このスクリプトを実行すると、以下のように制約が生成されました。

SQL Server の CHECK 制約を作成する 2


試しに、以下のスクリプトで、StudentID = 5 の Gender を W に更新してみます。

UPDATE  Student
SET     Gender = 'W'
WHERE   StudentID = 5;

次のように、UPDATE ステートメントが、先ほど追加した CHECK 制約の CK_Student_Gender と競合しています、というエラーになって、データは更新されませんでした。

SQL Server の CHECK 制約を作成する 4
SQL Server の CHECK 制約を作成する 5

これで、Student テーブルの Gender カラムには M か F か NULL しか入っていないという前提で、他のスクリプトやコードが書けますね!


次は、ユーザー定義関数を使った CHECK 制約を作成してみましょう。

© 2010-2024 SQL Server 入門