GUID を入力する列に一意の制約を設定したいと考えています。ただし、データにはこの列の null 値が含まれています。複数の null 値を許可する制約を作成するにはどうすればよいですか?
これはシナリオ例次のスキーマを検討してください。
CREATE TABLE People (
Id INT CONSTRAINT PK_MyTable PRIMARY KEY IDENTITY,
Name NVARCHAR(250) NOT NULL,
LibraryCardId UNIQUEIDENTIFIER NULL,
CONSTRAINT UQ_People_LibraryCardId UNIQUE (LibraryCardId)
)
次に、私が何を達成しようとしているのかを示す次のコードを参照してください。
-- This works fine:
INSERT INTO People (Name, LibraryCardId)
VALUES ('John Doe', 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA');
-- This also works fine, obviously:
INSERT INTO People (Name, LibraryCardId)
VALUES ('Marie Doe', 'BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB');
-- This would *correctly* fail:
--INSERT INTO People (Name, LibraryCardId)
--VALUES ('John Doe the Second', 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA');
-- This works fine this one first time:
INSERT INTO People (Name, LibraryCardId)
VALUES ('Richard Roe', NULL);
-- THE PROBLEM: This fails even though I'd like to be able to do this:
INSERT INTO People (Name, LibraryCardId)
VALUES ('Marcus Roe', NULL);
最後のステートメントは失敗し、次のメッセージが表示されます:
UNIQUE KEY 制約 'UQ_People_LibraryCardId' に違反しています。オブジェクト 'dbo.People' に重複するキーを挿入できません。
NULL
実際のデータの一意性をチェックしながら、複数の値を許可するようにスキーマや一意性制約を変更するにはどうすればよいでしょうか?
ベストアンサー1
あなたが探しているのは、確かに ANSI 標準 SQL:92、SQL:1999、および SQL:2003 の一部です。つまり、UNIQUE 制約では重複する非 NULL 値は許可されませんが、複数の NULL 値は受け入れる必要があります。
ただし、Microsoft の SQL Server の世界では、単一の NULL は許可されますが、複数の NULL は許可されません...
SQL Server 2008では、NULL を除外する述語に基づいて一意のフィルター インデックスを定義できます。
CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;
以前のバージョンでは、制約を適用するために NOT NULL 述語を持つ VIEWS を使用することができました。