SQL CHECK制約

概要:このチュートリアルでは、SQL CHECK制約を使用して、ブール式に基づいて、列または列のセットのデータを検証する方法を学びます。

SQL CHECK制約の紹介

CHECK制約はSQLの整合性制約であり、列または列のセットの値がブール式を満たす必要があることを指定できます。

CHECK制約は、単一の列またはテーブル全体に定義できます。単一の列にCHECK制約を定義した場合、CHECK制約はその列の値のみをチェックします。ただし、テーブルにCHECK制約を定義した場合、同じ行の他の列の値に基づいて列の値を制限します。

CHECK制約は、キーワードCHECKに続いて、括弧で囲まれたブール式で構成されます。

CHECK(Boolean_expression)Code language: SQL (Structured Query Language) (sql)

CHECK制約に名前を割り当てるには、次の構文を使用します。

CONSTRAINT constraint_name CHECK(Boolean_expression)Code language: SQL (Structured Query Language) (sql)

ブール式がtrueまたはNULL値を返すと、CHECK制約が満たされることに注意することが重要です。オペランドの1つがNULLの場合、ほとんどのブール式はNULLと評価されるため、制約された列にNULL値が入ることを防ぎません。列にNULL値が含まれないようにするには、NOT NULL制約を使用します。

SQL CHECK制約の例

CHECK制約を作成する例をいくつか見てみましょう。

selling_price列の値が正であるproductsテーブルを作成するには、次のCREATE TABLEステートメントを使用します。

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    selling_price NUMERIC(10,2) CHECK (selling_price > 0)
);Code language: SQL (Structured Query Language) (sql)

CHECK制約は、列のデータ型の後に記述します。挿入または更新で販売価格を負の値にすると、式selling_price >= 0がfalseを返し、RDMBSがエラーを返します。

CHECK制約に個別の名前を割り当てることができます。制約名を使用すると、RDBMSから返されるエラーメッセージを明確にし、どの制約に値が違反しているかを正確に知ることができます。

制約に名前を割り当てるには、キーワードCONSTRAINTの後に制約の名前を使用します。

たとえば、次のステートメントは、selling_price列のCHECK制約の名前としてpositive_selling_priceを割り当てます。

CHECK制約を割り当てるための構文は次のとおりです。

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    selling_price NUMERIC(10,2) CONSTRAINT positive_selling_price CHECK (selling_price > 0)
);Code language: SQL (Structured Query Language) (sql)

複数の列を参照するCHECK制約を定義できます。productsテーブルに販売価格と原価の両方を保存し、原価が常に販売価格よりも低くなるようにしたいとします。

CREATE TABLE products (
	product_id INT PRIMARY KEY,
	product_name VARCHAR (255) NOT NULL,
	selling_price NUMERIC (10, 2) CHECK (selling_price > 0),
	cost NUMERIC (10, 2) CHECK (cost > 0),
	CHECK (selling_price > cost)
);Code language: SQL (Structured Query Language) (sql)

まず、各列の値が正であることを確認するために、selling_price列とcost列に関連付けられた2つのCHECK制約があります。

次に、どの列にもアタッチされていない別のCHECK制約があります。代わりに、CREATE TABLEステートメントの最後の句として表示されます。

最初の2つの制約は列制約であり、3番目の制約はテーブル制約です。テーブル制約はどの列にも関連付けられていません。

次の構文を使用して、テーブル制約に名前を割り当てることができます。

CREATE TABLE table_name (
   …,
   CONSTRAINT check_constraint_name CHECK (Boolean_expression)
);Code language: SQL (Structured Query Language) (sql)

たとえば、次のステートメントは上記のCHECK制約に名前を割り当てます。

CREATE TABLE products (
	product_id INT PRIMARY KEY,
	product_name VARCHAR (255) NOT NULL,
	selling_price NUMERIC (10, 2) CHECK (selling_price > 0),
	cost NUMERIC (10, 2) CHECK (cost > 0),
	CONSTRAINT valid_selling_price  CHECK (selling_price > cost)
);Code language: SQL (Structured Query Language) (sql)

このチュートリアルでは、ブール式に基づいてデータを検証するためにCHECK制約を使用する方法を学びました。

このチュートリアルは役に立ちましたか?