1. ホーム
  2. sql-server

[解決済み] NULLも許容するユニークな制約を作成するにはどうしたらいいですか?

2022-03-14 03:05:24

質問

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 の値で、実際のデータで一意性のチェックを行うことができますか?

どのように解決するのですか?

SQL Server 2008 +(英語版

複数のNULLを受け入れるユニークなインデックスを作成するには WHERE 節があります。を参照してください。 回答は以下の通りです。 .

SQL Server 2008 より前のバージョン

UNIQUE制約を作成し、NULLを許可することはできません。NEWID() のデフォルト値を設定する必要があります。

UNIQUE制約を作成する前に、既存の値をNULLのNEWID()に更新してください。