SQL ServerでNULLを許可する一意制約を作成する方法
SQL Server で NULL を許可する一意制約を作成する方法
UNIQUE 制約と IS NULL 条件の組み合わせ
ALTER TABLE テーブル名
ADD CONSTRAINT 制約名 UNIQUE (列名)
WHERE 列名 IS NOT NULL;
この方法では、UNIQUE 制約と IS NULL 条件を組み合わせて、NULL 値以外の値が重複することを防ぎます。
例:
ALTER TABLE 顧客
ADD CONSTRAINT 顧客コード_UNIQUE UNIQUE (顧客コード)
WHERE 顧客コード IS NOT NULL;
この例では、顧客
テーブルの 顧客コード
列に一意制約を作成します。ただし、NULL 値は許可されます。
UNIQUEIDENTIFIER データ型を使用する
ALTER TABLE テーブル名
ADD 列名 UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID());
この方法では、UNIQUEIDENTIFIER
データ型を使用します。UNIQUEIDENTIFIER
データ型は、重複しない128ビットの値を生成します。
ALTER TABLE 顧客
ADD 顧客ID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID());
この例では、顧客
テーブルに 顧客ID
列を追加します。顧客ID
列は、UNIQUEIDENTIFIER
データ型で、NULL 値を許可せず、デフォルト値として NEWID()
関数を呼び出します。
NEWID()
関数は、重複しない128ビットの値を生成します。
- 既存のテーブルに一意制約を追加する場合は、1つ目の方法が適しています。
注意事項
- UNIQUE 制約と IS NULL 条件の組み合わせを使用する場合は、NULL 値を更新すると、制約違反が発生する可能性があります。
UNIQUEIDENTIFIER
データ型を使用する場合は、データサイズが大きくなることに注意が必要です。
SQL Server で NULL を許可する一意制約を作成するには、2つの方法があります。どちらの方法を使用するかは、状況によって異なります。
UNIQUE 制約と IS NULL 条件の組み合わせ
USE AdventureWorks2019;
GO
ALTER TABLE Person.Address
ADD CONSTRAINT AK_Address_AddressLine1_City_StateProvinceID_PostalCode
UNIQUE (AddressLine1, City, StateProvinceID, PostalCode)
WHERE AddressLine1 IS NOT NULL
AND City IS NOT NULL
AND StateProvinceID IS NOT NULL
AND PostalCode IS NOT NULL;
GO
UNIQUEIDENTIFIER データ型を使用する
USE AdventureWorks2019;
GO
ALTER TABLE Person
ADD PersonID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID());
GO
SQL Server で NULL を許可する一意制約を作成する他の方法
CHECK 制約を使用する
ALTER TABLE テーブル名
ADD CONSTRAINT 制約名 CHECK (列名 IS NULL OR 列名 IS UNIQUE);
この方法では、CHECK 制約を使用して、列名
が NULL 値であるか、または一意であることを確認します。
ALTER TABLE 顧客
ADD CONSTRAINT 顧客コード_UNIQUE CHECK (顧客コード IS NULL OR 顧客コード IS UNIQUE);
DEFAULT 値と UNIQUE 制約を使用する
ALTER TABLE テーブル名
ADD 列名 VARCHAR(50) NULL DEFAULT (NEWID());
ALTER TABLE テーブル名
ADD CONSTRAINT 制約名 UNIQUE (列名);
この方法では、DEFAULT 値を使用して、NULL 値でない場合は一意な値を生成します。
ALTER TABLE 顧客
ADD 顧客コード VARCHAR(50) NULL DEFAULT (NEWID());
ALTER TABLE 顧客
ADD CONSTRAINT 顧客コード_UNIQUE UNIQUE (顧客コード);
この例では、顧客
テーブルの 顧客コード
列に、50文字長の VARCHAR
型の列を追加します。顧客コード
列は、NULL 値を許可し、デフォルト値として NEWID()
関数を呼び出します。
その後、顧客コード
列に一意制約を作成します。
パーティションテーブルを使用する
CREATE TABLE テーブル名 (
列名1 データ型,
列名2 データ型,
...
)
PARTITION BY RANGE (列名)
(
PARTITION 1 VALUES LESS THAN (値1),
PARTITION 2 VALUES LESS THAN (値2),
...
);
ALTER TABLE テーブル名
ADD CONSTRAINT 制約名 UNIQUE (列名)
ON PARTITION (PARTITION 1, PARTITION 2, ...);
この方法では、パーティションテーブルを使用して、各パーティション内で一意な値を許可します。
CREATE TABLE 顧客 (
顧客コード VARCHAR(50) NULL,
...
)
PARTITION BY RANGE (顧客コード)
(
PARTITION 1 VALUES LESS THAN ('A'),
PARTITION 2 VALUES LESS THAN ('B'),
...
);
ALTER TABLE 顧客
ADD CONSTRAINT 顧客コード_UNIQUE UNIQUE (顧客コード)
ON PARTITION (PARTITION 1, PARTITION 2, ...);
この例では、顧客
テーブルを 顧客コード
列に基づいてパーティション化します。
- 既存のテーブルに一意制約を追加する場合は、CHECK 制約を使用するのが簡単です。
- 新しいテーブルを作成する場合は、DEFAULT 値と UNIQUE 制約を使用するのが一般的です。
- 大量のデータがある場合は、パーティションテーブルを使用するのが効率的です。
- CHECK 制約は、パフォーマンスに影響を与える可能性があります。
- DEFAULT 値と UNIQUE 制約を使用する場合は、デフォルト値が重複しないことを確認する必要があります。
- パーティションテーブルは、複雑な管理が必要になる場合があります。
sql-server t-sql