SSMSを使ってSQL Serverで複数列ユニーク制約を設定する方法
SQL Server での複数列ユニーク制約
SQL Server でテーブルに 複数列ユニーク制約 を設定すると、複数の列の組み合わせ が重複することを防ぐことができます。これは、データの整合性と一意性を保つために重要です。
設定方法
T-SQL を使用
CREATE TABLE dbo.MyTable (
ID INT NOT NULL,
Name VARCHAR(50) NOT NULL,
Age INT NOT NULL,
UNIQUE (ID, Name) -- 複数列ユニーク制約
);
SSMS を使用
- SSMS でテーブルを開きます。
- デザイン ビューに切り替えます。
- [列名] ペインで、複数の列 を選択します。
- 右クリックして [ユニーク キーの選択] をクリックします。
動作
複数列ユニーク制約 が設定されたテーブルに、同じ値を持つ複数の行 を挿入しようとすると、エラーが発生します。
例
INSERT INTO dbo.MyTable (ID, Name, Age) VALUES (1, 'John Doe', 30);
INSERT INTO dbo.MyTable (ID, Name, Age) VALUES (2, 'Jane Doe', 25);
INSERT INTO dbo.MyTable (ID, Name, Age) VALUES (1, 'John Doe', 30); -- エラーが発生
NULL 値
SQL Server では、NULL 値 は ユニーク制約 の評価において 無視 されます。つまり、複数の行 で 同じ列 に NULL 値 が含まれていても、エラー は発生しません。
INSERT INTO dbo.MyTable (ID, Name, Age) VALUES (1, NULL, 30);
INSERT INTO dbo.MyTable (ID, Name, Age) VALUES (2, 'Jane Doe', 25);
INSERT INTO dbo.MyTable (ID, Name, Age) VALUES (1, NULL, 30); -- エラーが発生しない
注意点
- 複数の列ユニーク制約 は、主キー とは異なります。主キー は NULL 値 を許容せず、テーブル内で一意である必要があります。
- 複数の列ユニーク制約 は、インデックス を使用して高速化できます。
USE AdventureWorks2019;
CREATE TABLE dbo.Employees (
EmployeeID INT NOT NULL IDENTITY(1,1),
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
DepartmentID INT NOT NULL,
UNIQUE (FirstName, LastName, DepartmentID) -- 複数列ユニーク制約
);
データ挿入
以下のコードは、従業員 テーブルに 2 行 のデータを挿入します。
INSERT INTO dbo.Employees (FirstName, LastName, DepartmentID)
VALUES ('John', 'Doe', 1);
INSERT INTO dbo.Employees (FirstName, LastName, DepartmentID)
VALUES ('Jane', 'Doe', 2);
以下のコードは、氏名 と 部署 の組み合わせが重複しているため、エラー が発生します。
INSERT INTO dbo.Employees (FirstName, LastName, DepartmentID)
VALUES ('John', 'Doe', 1); -- エラーが発生
SSMS を使用して 複数列ユニーク制約 を設定するには、以下の手順を実行します。
- SSMS で AdventureWorks2019 データベースに接続します。
- オブジェクト エクスプローラー で テーブル フォルダを展開します。
- dbo.Employees テーブルを右クリックして [デザイン] をクリックします。
- デザイン ビューで FirstName、LastName、DepartmentID 列を選択します。
- Employees テーブルに 複数列ユニーク制約 が設定されます。
インデックス
複数列ユニーク制約 に インデックス を作成するには、以下のコードを使用します。
CREATE UNIQUE INDEX IX_Employees_FirstName_LastName_DepartmentID
ON dbo.Employees (FirstName, LastName, DepartmentID);
NULL 値
NULL 値 は ユニーク制約 の評価において 無視 されます。
INSERT INTO dbo.Employees (FirstName, LastName, DepartmentID)
VALUES ('John', NULL, 1);
INSERT INTO dbo.Employees (FirstName, LastName, DepartmentID)
VALUES ('John', NULL, 1); -- エラーが発生しない
主キー
主キー は NULL 値 を許容せず、テーブル内で 一意 である必要があります。
ALTER TABLE dbo.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (EmployeeID);
- 複数列ユニーク制約 は、複数の列 の組み合わせに基づいてデータの 一意性 を保証します。
- インデックス を作成することで、複数列ユニーク制約 のパフォーマンスを向上させることができます。
複数列ユニーク制約を設定する他の方法
UNIQUE キー制約 は、ALTER TABLE ステートメントを使用して既存のテーブルに追加できます。
ALTER TABLE dbo.MyTable
ADD CONSTRAINT UK_MyTable_ID_Name UNIQUE (ID, Name);
CHECK 制約
CHECK 制約 を使用して、複数列 の組み合わせが 一意 であることを確認することもできます。
ALTER TABLE dbo.MyTable
ADD CONSTRAINT CK_MyTable_UniqueCombination CHECK (
(ID IS NOT NULL AND Name IS NOT NULL)
AND (EXISTS (SELECT 1 FROM dbo.MyTable AS T
WHERE T.ID = ID AND T.Name = Name))
);
UNIQUE インデックス
UNIQUE インデックス を作成することで、複数列 の組み合わせに基づいてデータの 一意性 を保証することができます。
CREATE UNIQUE INDEX IX_MyTable_ID_Name
ON dbo.MyTable (ID, Name);
トリガー
トリガー を使用して、INSERT 操作の前に 複数列 の組み合わせが 一意 であることを確認することもできます。
CREATE TRIGGER TR_MyTable_UniqueCombination
ON dbo.MyTable
FOR INSERT
AS
BEGIN
IF EXISTS (SELECT 1 FROM dbo.MyTable AS T
WHERE T.ID = ID AND T.Name = Name)
BEGIN
ROLLBACK TRANSACTION;
END
END;
sql-server sql-server-2008 ssms