SQL Server の UNIQUE 制約を作成する

SQL Server の UNIQUE 制約を作成する

前回 「ユーザー定義関数を使った CHECK 制約を作成する」 では、ユーザー定義関数を使って CHECK 制約を追加して動作を確認しました。

今回は、UNIQUE 制約を作成してみましょう。

UNIQUE 制約を作成しておくと、指定したカラムの値のコンビネーションが一意になるように制限してくれるので、テーブル内のデータの整合性を保つのに役立ちます。


既存のテーブルに UNIQUE 制約を追加する

既存のテーブルのカラムに、UNIQUE 制約を追加するシンプルな構文は次の通りです。

ALTER TABLE [テーブル名] ADD CONSTRAINT [ユニーク制約名]
    UNIQUE ( [カラム 1] (,[カラム 2], ...) );

[ユニーク制約名] は他のオブジェクトの名前とかぶらなければ何でも OK です。 私はだいたい UQ_[テーブル名]_[関連するカラム名] などにしています。

UNIQUE 制約は NULL 値を許容するカラムにも設定することができますが、NULL もひとつの値と判断されます。

既存のデータが既にユニークでない場合は、UNIQUE 制約を追加する ALTER TABLE のスクリプトがエラーになり、UNIQUE 制約は生成できません。

それでは、実際に UNIQUE 制約を追加してみましょう。 次のような Branch テーブルがあります。

CREATE TABLE Branch (
	BranchID	INT NOT NULL IDENTITY(1,1),
	CompanyCode NVARCHAR(3) NOT NULL,
	BranchCode	NVARCHAR(5) NOT NULL,
	BranchName	NVARCHAR(100) NULL,
	CONSTRAINT PK_Branch PRIMARY KEY CLUSTERED (BranchID)
);

INSERT INTO Branch 
	(CompanyCode, BranchCode, BranchName)
VALUES	
	('ABC', 'NYC', 'NYC Branch'),
	('ABC', 'LAX1', 'LAX Branch 1'),
	('ABC', 'LAX2', 'LAX Branch 2'),
	('XYZ', 'NYC', 'NYC Branch');

SELECT	*
FROM	Branch;

SQL Server の UNIQUE 制約を作成する 1
SQL Server の UNIQUE 制約を作成する 2


この Branch テーブルで、ひとつの CompanyCode 内で、BranchCode がユニークになるように制限するには、次のように UNIQUE 制約を追加します。

ALTER TABLE Branch 
ADD CONSTRAINT UQ_Branch_CompanyCodeBranchCode UNIQUE (CompanyCode, BranchCode); 

SQL Server の UNIQUE 制約を作成する 3
SQL Server の UNIQUE 制約を作成する 4


試しに、既存のデータと同じ CompanyCode と BranchCode のコンビネーションを挿入してみます。

INSERT INTO Branch 
	(CompanyCode, BranchCode, BranchName)
VALUES	
	('ABC', 'LAX2', 'LAX Branch 2 New');

[実行結果] SQL Server の UNIQUE 制約を作成する 5
SQL Server の UNIQUE 制約を作成する 6

このように、違反となった制約名や重複するキーの値までエラーメッセージに出力してくれ、データは挿入されませんでした。


既存のテーブルの複数のカラムに UNIQUE 制約を追加する方法をご紹介しましたが、以下のようにして、テーブル生成時と同時につけることも可能です。

CREATE TABLE Branch (
	BranchID	INT NOT NULL IDENTITY(1,1),
	CompanyCode NVARCHAR(3) NOT NULL,
	BranchCode	NVARCHAR(5) NOT NULL,
	BranchName	NVARCHAR(100) NULL,
	CONSTRAINT PK_Branch PRIMARY KEY CLUSTERED (BranchID),
	CONSTRAINT UQ_Branch_CompanyCodeBranchCode UNIQUE (CompanyCode, BranchCode)
);
© 2010-2024 SQL Server 入門