WITH CHECK ADD CONSTRAINT と CHECK CONSTRAINT vs. ADD CONSTRAINT の違いとは?

2024-04-02

この解説では、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


XSDファイルをアップロードしてデータベーステーブルを自動生成するオンラインサービス

XSDファイルはXMLスキーマを定義するファイルです。このファイルからデータベーステーブルを作成することで、XMLデータをデータベースに格納し、効率的に管理することができます。方法XSDファイルからデータベーステーブルを作成するには、以下の2つの方法があります。...


nvarchar(MAX) vs. varchar(n) vs. ntext vs. xml:最適なデータ型を選ぶための比較

nvarchar(MAX) を常に使用することは、いくつかの利点があります。文字列長の制限を気にする必要がありません。非常に長い文字列を格納できます。将来的に文字列が長くなる可能性がある場合に備えて、柔軟性を確保できます。パフォーマンスの低下...


T-SQLを使用してCSVファイルをインポートし、列に分割する方法

CSVファイルは、カンマ区切りでデータを格納する一般的なファイル形式です。SQL Server 2008では、T-SQLを使用してCSVファイルをインポートし、各フィールドを個別の列に分割することができます。これにより、CSVファイルのデータを構造化されたテーブルに格納し、分析や処理を容易にすることができます。...


更新された列だけをトリガー:SQL Serverでスマートなデータ操作を実現

SQL Server では、トリガーと呼ばれる仕組みを使って、データベースに対する操作に応じて自動的に処理を実行することができます。トリガーには様々な種類がありますが、中でも UPDATE トリガー は、テーブル内のデータが更新された際に実行されるものです。...


SQL Server で同じデータベース内にテーブルを複製する:初心者でも安心な手順ガイド

SELECT INTO ステートメントを使用するこれは、最も簡単で基本的な方法です。以下の構文を使用します。この例では、OriginalTableName テーブルのすべてのデータが NewTableName という新しいテーブルにコピーされます。...