SQL ServerのCHECK制約を完全解説:データの整合性を保つ方法

SQL Serverのデータベース設計において、データの整合性を保つことは非常に重要です。そのために役立つ仕組みの1つが「CHECK制約」です。

本記事では、SQL ServerのCHECK制約について詳しく解説し、その実用例とベストプラクティスを紹介します。さらに、CHECK制約を理解するための演習問題と解答例も用意していますので、ぜひ実践してみてください。


CHECK制約とは?

CHECK制約は、特定の条件を満たすデータのみをテーブルに挿入・更新可能にするための制約です。これにより、不適切なデータが格納されることを防ぎます。

特徴

  • 条件式を使用してデータの制約を定義
  • 列単位またはテーブル単位で指定可能
  • パフォーマンスへの影響が少ない

使用例

例えば、商品の価格が負の値にならないようにするには、次のようなCHECK制約を追加します。

ALTER TABLE Products
ADD CONSTRAINT CK_Price_Positive CHECK (Price >= 0);

CHECK制約の基本的な書き方

テーブル作成時に定義

新しいテーブルを作成する際に、CHECK制約を直接追加することができます。

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Age INT,
    Salary DECIMAL(10, 2),
    CONSTRAINT CK_Age_Positive CHECK (Age > 0),
    CONSTRAINT CK_Salary_Min CHECK (Salary >= 30000)
);

既存のテーブルに追加

既存のテーブルにも後からCHECK制約を追加可能です。

ALTER TABLE Employees
ADD CONSTRAINT CK_Age_Positive CHECK (Age > 0);

CHECK制約の削除

CHECK制約を削除する際には、次のように記述します。

ALTER TABLE Employees
DROP CONSTRAINT CK_Age_Positive;

CHECK制約の使用例

数値範囲の制約

商品の在庫数が0以上100以下であることを保証する例です。

CREATE TABLE Inventory (
    ItemID INT PRIMARY KEY,
    Quantity INT,
    CONSTRAINT CK_Quantity_Range CHECK (Quantity BETWEEN 0 AND 100)
);

特定の値のみ許可

性別を「M(男性)」または「F(女性)」のみに制限する例です。

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Gender CHAR(1),
    CONSTRAINT CK_Gender CHECK (Gender IN ('M', 'F'))
);

日付の範囲

注文日が現在の日付以前であることを保証する例です。

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATE,
    CONSTRAINT CK_OrderDate CHECK (OrderDate <= GETDATE())
);

CHECK制約の注意点

NULL値の扱い

CHECK制約では、NULL値は条件に含まれません。たとえば、次の制約はAgeがNULLである場合には適用されません。

CHECK (Age > 18)

NULL値が許可される場合、その点に注意する必要があります。

複雑な条件はNG

CHECK制約では、サブクエリや他のテーブルのデータを参照することはできません。単純な条件式に限定されます。


CHECK制約を使う上でのベストプラクティス

  1. 適切な命名規則を使用
    • 制約名は「CK_<テーブル名>_<条件>」の形式で記述すると、管理がしやすくなります。
  2. 複数列を対象とする制約は慎重に
    • 複雑な条件の場合、トリガーやビューを使うことを検討しましょう。
  3. 定期的にテストを実施
    • 新しいデータが正しく制約に準拠しているかどうかを確認することが重要です。

演習問題

CHECK制約の知識を深めるための演習問題を用意しました。SQLスクリプトを書いて、CHECK制約を実際に適用してみましょう。

問題1: 年齢制限

従業員テーブルに以下の要件を満たすCHECK制約を追加してください。

  • 従業員の年齢は18歳以上65歳以下であること。

問題2: 商品の割引率

商品テーブルに、割引率が0%から50%の範囲内であることを保証する制約を追加してください。

問題3: カテゴリの限定

商品のカテゴリが「Electronics」「Clothing」「Books」のいずれかであることを保証する制約を追加してください。


解答例

解答1: 年齢制限

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name NVARCHAR(50),
    Age INT,
    CONSTRAINT CK_Age_Range CHECK (Age BETWEEN 18 AND 65)
);

解答2: 商品の割引率

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName NVARCHAR(50),
    DiscountRate DECIMAL(5, 2),
    CONSTRAINT CK_Discount_Range CHECK (DiscountRate BETWEEN 0 AND 50)
);

解答3: カテゴリの限定

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName NVARCHAR(50),
    Category NVARCHAR(20),
    CONSTRAINT CK_Category_Limit CHECK (Category IN ('Electronics', 'Clothing', 'Books'))
);

まとめ

SQL ServerのCHECK制約を使用することで、データの一貫性と正確性を向上させることができます。

制約を適切に設計することで、アプリケーションの品質向上とトラブル回避に大きく貢献します。

今回の記事を参考に、ぜひCHECK制約を活用してみてください!