データの整合性を守るには?SQL Serverの制約(Constraints)の基本をわかりやすく解説
SQL Serverでは、テーブル内のデータが矛盾しないようにルールを定義する仕組みがあります。
それが制約(Constraints)です。
制約を設定することで「重複を防ぐ」「関連データを保証する」「値の範囲を制限する」といった整合性を自動的に担保できます。
この記事では、PRIMARY KEY・FOREIGN KEY・CHECK・DEFAULTなど代表的な制約の種類と、その使い方を初心者にもわかりやすく解説します。
目次
制約(Constraint)とは?
制約の役割
制約(Constraint)は、テーブル内のデータに対して「どんな値を許可するか」を定義するルールです。
アプリケーション側でチェックするのではなく、データベース側で整合性を強制する点が特徴です。
代表的な制約には次のような種類があります。
| 制約名 | 意味 | 用途 |
|---|---|---|
| PRIMARY KEY | 重複とNULLを禁止(主キー) | 行を一意に識別する |
| FOREIGN KEY | 他テーブルとの関連性を保証 | 親子関係の整合性を保つ |
| CHECK | 特定条件を満たす値のみ許可 | 値の範囲や論理チェック |
| DEFAULT | 値未指定時に初期値を設定 | 省略時の自動補完 |
PRIMARY KEY(主キー制約)
PRIMARY KEYとは
PRIMARY KEY制約は、テーブル内の行を一意に識別するための列に設定します。
NULLを許可せず、重複もできないため、データの一意性を保証します。
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
Name NVARCHAR(50),
City NVARCHAR(50)
);
複数の列を組み合わせて主キーにすることも可能です。
CREATE TABLE Orders (
OrderID INT,
ProductID INT,
Quantity INT,
PRIMARY KEY (OrderID, ProductID)
);
主キーはテーブルごとに1つだけ定義できます。
FOREIGN KEY(外部キー制約)
FOREIGN KEYとは
FOREIGN KEY制約は、他のテーブルの主キーを参照して、関連するデータの整合性を保ちます。
これにより「存在しない顧客の注文データ」が登録されるのを防げます。
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATE,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
外部キーを設定すると、参照先のデータが削除・更新される際に自動処理(カスケード動作)を設定することもできます。
FOREIGN KEY (CustomerID)
REFERENCES Customers(CustomerID)
ON DELETE CASCADE
ON UPDATE CASCADE;
これにより、親テーブルの行が削除されたときに、関連する子テーブルの行も自動で削除されます。
CHECK制約とDEFAULT制約
CHECK制約:値の範囲や条件を制限
CHECK制約を使うと、列に格納できる値を条件式で制限できます。
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Price INT CHECK (Price > 0),
Stock INT CHECK (Stock >= 0)
);
この例では、価格が0以下や在庫がマイナスのデータを登録できなくなります。
DEFAULT制約:値未指定時の初期値を設定
DEFAULT制約は、INSERT文で値が指定されなかった場合に自動で設定される初期値を定義します。
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(50),
CreatedAt DATETIME DEFAULT GETDATE(),
IsActive BIT DEFAULT 1
);
この例では、登録時に日付やフラグが指定されなくても、自動的に現在日時と「1(有効)」が入ります。
制約の追加・削除方法
制約の追加(ALTER TABLE)
既存のテーブルにも、ALTER TABLE文で制約を追加できます。
ALTER TABLE Orders
ADD CONSTRAINT FK_Orders_Customers
FOREIGN KEY (CustomerID)
REFERENCES Customers(CustomerID);
制約名を指定すると、後から識別しやすくなります。
制約の削除(DROP CONSTRAINT)
不要になった制約は、次のように削除できます。
ALTER TABLE Orders
DROP CONSTRAINT FK_Orders_Customers;
制約名は管理ビュー(sys.objects や sys.foreign_keys)から確認できます。
SELECT name, type_desc
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT%';
まとめと次のステップ
学んだ内容の整理
- 制約(Constraint)はデータ整合性を保証する仕組み。
- PRIMARY KEY:重複・NULLを禁止し、行を一意に識別。
- FOREIGN KEY:他テーブルとの関係を保証。
- CHECK:値の範囲や条件を制限。
- DEFAULT:値未指定時の初期値を自動設定。
- ALTER TABLEで制約を追加・削除できる。
参考リンク

0 件のコメント:
コメントを投稿