概要:このチュートリアルでは、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制約を使用する方法を学びました。