両方がnullの場合を除いて値を一意にしたい場合は、少なくとも1つの値がnullでない限り、値を一意にしたいことを意味します。インデックスのフィルターには。AND
がありますが、が必要ですOR
。
CREATE UNIQUE NONCLUSTERED INDEX MyIndex ON dbo.MyTable(col1, col2)
WHERE col1 IS NOT NULL OR col2 IS NOT NULL -- (note: doesn't work)
しかし...あなたはこれを行うことはできません。SQL Serverでは、AND条件を使用してwhere句のみを作成できます。また、永続化された計算列を使用してそれを行うことはできません。
代わりに、元のテーブルにインデックス付きビューを作成し、そのテーブルに一意のインデックスを配置することができます。少し重いですが、うまくいくはずです。
だから...@Meffのスクリプトを借りるには、次のようなものを見ていることになります。
CREATE TABLE dbo.MyTable
(
Col1 INT NULL,
Col2 INT NULL
)
GO
CREATE VIEW dbo.MyTableUniqueView WITH SCHEMABINDING AS
SELECT Col1, Col2 FROM dbo.MyTable
WHERE Col1 IS NOT NULL OR Col2 IS NOT NULL
GO
CREATE UNIQUE CLUSTERED INDEX MyTableUniqueIndex
ON dbo.MyTableUniqueView(Col1, Col2)
GO
INSERT INTO MyTable(Col1, Col2)
VALUES(NULL, NULL) --Works
INSERT INTO MyTable(Col1, Col2)
VALUES(NULL, NULL) --Works
SELECT * FROM MyTable
INSERT INTO MyTable(Col1, Col2)
VALUES(1, 1) --Works
INSERT INTO MyTable(Col1, Col2)
VALUES(1, 1) --Fails
INSERT INTO MyTable(Col1, Col2)
VALUES(1, null) --Works
INSERT INTO MyTable(Col1, Col2)
VALUES(1, null) --Fails
SELECT * FROM MyTable
GO
DROP VIEW MyTableUniqueView
DROP TABLE MyTable