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 テーブルがあります。
Gender (性別) カラムには M (male-男性)、F (female-女性) のどちらかの値しか入って欲しくないので CHECK 制約を追加します。
Gender が M か F しか入らないように Student テーブル に CHECK 制約を追加するスクリプトは以下の通りです。
ALTER TABLE Student ADD CONSTRAINT CK_Student_Gender CHECK (Gender IN ('M','F'));
このスクリプトを実行すると、以下のように制約が生成されました。
試しに、以下のスクリプトで、StudentID = 5 の Gender を W に更新してみます。
UPDATE Student SET Gender = 'W' WHERE StudentID = 5;
次のように、UPDATE ステートメントが、先ほど追加した CHECK 制約の CK_Student_Gender と競合しています、というエラーになって、データは更新されませんでした。
これで、Student テーブルの Gender カラムには M か F か NULL しか入っていないという前提で、他のスクリプトやコードが書けますね!
次は、ユーザー定義関数を使った CHECK 制約を作成してみましょう。