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;
この Branch テーブルで、ひとつの CompanyCode 内で、BranchCode がユニークになるように制限するには、次のように UNIQUE 制約を追加します。
ALTER TABLE Branch ADD CONSTRAINT UQ_Branch_CompanyCodeBranchCode UNIQUE (CompanyCode, BranchCode);
試しに、既存のデータと同じ CompanyCode と BranchCode のコンビネーションを挿入してみます。
INSERT INTO Branch (CompanyCode, BranchCode, BranchName) VALUES ('ABC', 'LAX2', 'LAX Branch 2 New');
[実行結果]
このように、違反となった制約名や重複するキーの値までエラーメッセージに出力してくれ、データは挿入されませんでした。
既存のテーブルの複数のカラムに 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) );