SQLのCREATE TABLEでテーブルの列に妥当性を検証する(CHECK)制約を設定する

SQLのCREATE TABLE文を使えば、データベースにテーブルを作成することができます。

テーブルを作成する際には、テーブルに作成する列を定義します。
列の定義では、列の名前と列のデータ型を指定することで、列を作成することができます。
列の名前と列のデータ型を指定した単純な列では、データ型に応じた値であれば、どのような値でも登録することができます。
例えば、数値のデータ型であるint型を指定した列では、-2,147,483,648 ~ 2,147,483,647の値が登録できます。

SQLServer 数値型のデータ範囲(最小値~最大値)
いつも忘れるので、数値型のデータ範囲について、簡単にまとめておきます。 整数型 整数型には「tinyint型」「smalli...

しかし、場合によっては、指定した範囲の値しか登録させたくない場合もあります。

SQLには、ある列の値に特定の値のみ格納できるように制限する仕組み(列に格納される値が妥当であるかどうかを検証する仕組み)が用意されています。

今回は、特定の列の値を制限するために使用するCHECK制約について紹介したいと思います。

テーブルを作成する基本的なCREATE TABLE文の書き方については、以下の記事を参考にしてください。

データベースのテーブルを作成するSQL CREATE TABLE
SQL文では、既存のテーブルに対してINSERT、UPDATE、DELETEなどのステートメントを使用して、テーブルやビューのデータ(レコー...

CHECK制約を設定するサンプルテーブル

本記事では、CHECK制約を設定するテーブルとして、以下のテーブルを使用します。

入金テーブル

テーブル定義

入金テーブルのテーブル定義は以下のようになります。

列名 データ型
入金番号 int
入金日 date
名義人 varchar(50)
入金額 int

SQL文

入金テーブルの基本的なCREATE TABLE文は以下のようになります。

CHECK制約の指定

特定の列にCHECK制約を指定するには、列の定義(列の名前と列のデータ型)の後にスペース文字列を入れて、その後にCHECK(制約の条件式)を記述します。
CHECK制約では、制約の条件として指定した式を満たす場合(trueとなる場合)の値のみ指定が許可されます。

例えば、入金テーブルの入金額に0よりも大きいの値を指定させる制約を指定する場合は、以下のようになります。

CHECK制約で指定する値には、固定値(リテラル値)の他に、キーワードや関数等も指定できます。

ここでは入金額に1~999999までの範囲のみを格納できるようにします。
CHECK制約の定義は次のようになります。

上記の例では「>=」演算子と「<=」演算子を使って記述しましたが、同様のことをBETEEEN演算子を使って記述した例も示しておきます。

次に、入金日の列に格納される日付の値が、現在の日付以前の値になるようなCHWECK制約を設定します。 以下にSQLServerのGETDATE関数を使用した場合の例を示します。 最後に、入金日の現在の日付以前の制約と、入金額が0より大きくなるようにする制約を指定した場合のCREATE TABLE文を記載しておきます。 テーブルにCHECK制約を指定しておくことで、予期しない値の登録を未然に防ぐことができるようになります。