NULL も許可する一意制約を作成するにはどうすればよいでしょうか? 質問する

NULL も許可する一意制約を作成するにはどうすればよいでしょうか? 質問する

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 を使用することができました。

おすすめ記事