SQL ServerのUNIQUE制約とは?特定の列の値が重複しないようにする方法と設定手順

SQL Serverでは、データベース内のデータの整合性を確保するために「制約」を利用します。その中でも「UNIQUE制約」は、特定の列に重複した値が入力されるのを防ぐための重要な仕組みです。

本記事では、SQL ServerにおけるUNIQUE制約について、基本的な知識から設定方法、注意点、さらに具体例を用いた解説を行います。

最後に、UNIQUE制約に関する演習問題もご用意しましたので、学んだ内容をぜひ実践してください!


UNIQUE制約とは?

定義

UNIQUE制約は、SQL Serverで特定の列または複数の列(複合キー)の値が他の行と重複しないことを保証するための制約です。

たとえば、以下のような状況を想定してください:

  • ユーザー情報を管理するテーブルで、email列に同じメールアドレスが2回入力されるのを防ぎたい。
  • 商品情報を管理するテーブルで、product_code列に同じ商品コードが登録されないようにしたい。

このような場合、UNIQUE制約を設定することでデータの一意性を保証できます。

主キーとの違い

  • 主キー (PRIMARY KEY)
    主キーは、一意性制約に加えて NULL値を許容しません
  • UNIQUE制約
    UNIQUE制約は、一意性を保証しますが NULL値を許容できます(ただし、列に1つだけNULL値が含まれる場合に限る)。

UNIQUE制約の主な用途

  1. 特定の列のデータを重複させない
  2. 複数列の組み合わせで一意性を保証する(複合キー)

SQL ServerでのUNIQUE制約の設定方法

方法1: テーブル作成時にUNIQUE制約を設定

新しいテーブルを作成する際に、UNIQUEキーワードを使用して制約を設定できます。

CREATE TABLE Users (
    user_id INT PRIMARY KEY,
    email NVARCHAR(255) UNIQUE,
    username NVARCHAR(50)
);

上記の例では、email列にUNIQUE制約を設定しています。同じメールアドレスを複数回登録することはできません。


方法2: 既存のテーブルにUNIQUE制約を追加

既存のテーブルにUNIQUE制約を後から追加する場合は、ALTER TABLE文を使用します。

ALTER TABLE Users
ADD CONSTRAINT UQ_Users_Email UNIQUE (email);

この例では、既存のUsersテーブルのemail列にUNIQUE制約を追加しています。


方法3: 複数列に対してUNIQUE制約を設定

複合キーとして複数列を組み合わせて一意性を保証することも可能です。

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    order_date DATE,
    CONSTRAINT UQ_Orders_Product_Customer UNIQUE (product_id, customer_id)
);

上記の例では、product_idとcustomer_idの組み合わせが一意であることを保証します。同じ商品が同じ顧客に重複して注文されることを防ぐことができます。


UNIQUE制約を削除する方法

UNIQUE制約を削除するには、ALTER TABLE文で制約名を指定して削除します。

ALTER TABLE Users
DROP CONSTRAINT UQ_Users_Email;

UQ_Users_Emailは制約名です。制約名がわからない場合は、sys.indexesやsys.key_constraintsのシステムビューを使って確認できます。


UNIQUE制約の注意点

  1. NULL値の扱い
    UNIQUE制約はNULL値を許容しますが、1つの列に複数のNULL値を入力するとエラーになります。これは、NULL値が「未知の値」として扱われ、重複とみなされないためです。
  2. 複合キーの順序
    複数列に対してUNIQUE制約を設定する場合、列の順序が重要です。異なる順序で指定すると、期待した動作をしないことがあります。
  3. パフォーマンスへの影響
    UNIQUE制約が設定された列にはインデックスが自動的に作成されます。そのため、大量のデータを挿入する際にパフォーマンスが低下する可能性があります。

実践演習問題

問題1: UNIQUE制約を設定するテーブルを作成

以下の条件を満たすProductsテーブルを作成してください:

  • product_id(主キー)
  • product_name(商品名、重複不可)
  • product_code(商品コード、重複不可)
  • price(価格)

問題2: 複合キーでUNIQUE制約を設定

Ordersテーブルを作成し、以下の条件を満たしてください:

  • order_id(主キー)
  • product_id(商品ID)
  • customer_id(顧客ID)
  • order_date(注文日)
  • product_idとcustomer_idの組み合わせが重複しないこと

問題3: UNIQUE制約を持つ列にデータを挿入する

以下のSQLを実行し、エラーが出るか確認してください。

INSERT INTO Products (product_id, product_name, product_code, price)
VALUES (1, 'Laptop', 'P123', 120000);

INSERT INTO Products (product_id, product_name, product_code, price)
VALUES (2, 'Desktop', 'P123', 90000); -- 重複するproduct_code

解答例

解答1: UNIQUE制約を設定したテーブル作成

CREATE TABLE Products (
    product_id INT PRIMARY KEY,
    product_name NVARCHAR(100) UNIQUE,
    product_code NVARCHAR(50) UNIQUE,
    price DECIMAL(10, 2)
);

解答2: 複合キーでUNIQUE制約を設定

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    order_date DATE,
    CONSTRAINT UQ_Orders_Product_Customer UNIQUE (product_id, customer_id)
);

解答3: データ挿入結果

最初のINSERT文は成功しますが、2番目のINSERT文はエラーになります。これは、product_code列がUNIQUE制約で定義されており、P123が重複しているためです。

エラー例
Violation of UNIQUE KEY constraint 'UQ_Products_Product_Code'. Cannot insert duplicate key in object 'dbo.Products'. The duplicate key value is (P123).

まとめ

UNIQUE制約は、特定の列や列の組み合わせにおいてデータの一意性を保証する強力なツールです。

本記事で解説した基本的な設定方法や注意点を押さえれば、SQL Serverでのデータベース設計がさらに堅牢になります。

また、演習問題に取り組むことで、実際のデータベース操作に活用できるスキルを磨いてください!