WITH CHECK ADD CONSTRAINT と CHECK CONSTRAINT vs. ADD CONSTRAINT の違いとは?
この解説では、SQL、SQL Server、T-SQLにおけるWITH CHECK ADD CONSTRAINTとCHECK CONSTRAINT vs. ADD CONSTRAINTの使用方法について、分かりやすく日本語で説明します。
WITH CHECK ADD CONSTRAINTは、テーブルに新しい制約を追加する際に、その制約が既存のデータに確実に適用されるようにするための構文です。この構文を使用すると、制約を追加する前に、既存のデータが制約を満たしているかどうかを確認することができます。
構文
WITH CHECK ADD CONSTRAINT <制約名>
CHECK (<条件>)
例
WITH CHECK ADD CONSTRAINT
age_check
CHECK (age >= 18)
この例では、age
列の値が18以上であることを確認するage_check
という制約を追加しています。
CHECK CONSTRAINTとADD CONSTRAINTは、どちらもテーブルに新しい制約を追加するための構文です。しかし、以下の点で違いがあります。
- CHECK CONSTRAINTは、制約の定義にのみ使用されます。
- ADD CONSTRAINTは、制約の定義と、既存のデータへの制約の適用に使用されます。
WITH CHECK ADD CONSTRAINTは、既存のデータが新しい制約を満たしていない場合に、エラーを発生させる必要がある場合に使用されます。
CREATE TABLE customers (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
WITH CHECK ADD CONSTRAINT
age_check
CHECK (age >= 18);
INSERT INTO customers (id, name, age)
VALUES (1, 'John Doe', 17);
この例では、age
列の値が18以上であることを確認するage_check
という制約を追加しています。INSERT
ステートメントを実行すると、age
列の値が17であるため、エラーが発生します。
WITH CHECK ADD CONSTRAINTは、既存のデータが新しい制約を満たしていない場合に、エラーを発生させる必要がある場合に使用されます。CHECK CONSTRAINTとADD CONSTRAINTは、どちらもテーブルに新しい制約を追加するための構文ですが、ADD CONSTRAINTは、既存のデータへの制約の適用にも使用できます。
WITH CHECK ADD CONSTRAINT
CREATE TABLE customers (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
WITH CHECK ADD CONSTRAINT
age_check
CHECK (age >= 18);
INSERT INTO customers (id, name, age)
VALUES (1, 'John Doe', 18),
(2, 'Jane Doe', 21);
-- エラーが発生
INSERT INTO customers (id, name, age)
VALUES (3, 'Sally Doe', 17);
CHECK CONSTRAINT vs. ADD CONSTRAINT
CREATE TABLE employees (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
salary DECIMAL(10,2) NOT NULL
);
-- 制約の定義のみ
CHECK CONSTRAINT salary_check
CHECK (salary >= 100000.00);
-- 制約の定義と既存のデータへの適用
ADD CONSTRAINT salary_check
CHECK (salary >= 100000.00);
-- エラーが発生
INSERT INTO employees (id, name, salary)
VALUES (1, 'John Doe', 99999.99);
このサンプルコードでは、employees
というテーブルを作成し、salary
列の値が10万円以上であることを確認するsalary_check
という制約を追加しています。
- 最初の
CHECK CONSTRAINT
は、制約の定義のみを行います。既存のデータは、制約が追加される前に挿入されているため、制約が適用されません。 - 2番目の
ADD CONSTRAINT
は、制約の定義と既存のデータへの適用を行います。INSERT
ステートメントを実行すると、salary
列の値が10万円未満であるため、エラーが発生します。
WITH CHECK ADD CONSTRAINT と CHECK CONSTRAINT vs. ADD CONSTRAINT 以外で、テーブルに制約を追加する方法
ALTER TABLE ステートメントを使用して、既存のテーブルに新しい制約を追加することができます。
ALTER TABLE customers
ADD CONSTRAINT age_check
CHECK (age >= 18);
DEFAULT 制約を使用して、列のデフォルト値を指定することができます。このデフォルト値は、制約として機能します。
CREATE TABLE employees (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
salary DECIMAL(10,2) NOT NULL DEFAULT 100000.00
);
PRIMARY KEY 制約を使用して、テーブル内の各行を一意に識別する列を指定することができます。
CREATE TABLE products (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
UNIQUE 制約を使用して、テーブル内の各列の値を一意にすることができます。
CREATE TABLE customers (
id INT NOT NULL,
name VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(50) NOT NULL
);
FOREIGN KEY 制約を使用して、別のテーブルとの関係を定義することができます。
CREATE TABLE orders (
id INT NOT NULL PRIMARY KEY,
customer_id INT NOT NULL,
product_id INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers (id),
FOREIGN KEY (product_id) REFERENCES products (id)
);
これらの方法は、それぞれ異なる目的で使用されます。どの方法を使用するかは、制約の要件によって異なります。
sql sql-server t-sql