如果您希望這些值是唯一的不同之處時,都爲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將only let you create a where clause with AND conditions。你也can't use a persisted computed column做到這一點。
相反,你可以做是創建於原始表的索引視圖,然後把唯一索引該。這有點重量級,但它應該工作。
所以......借用@ 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
權,你的腳本能正常工作,我可以猜測用戶界面插入空值,而不是空值。我會調查它。謝謝 – YMC
發現其他問題,請參閱更新的問題 – YMC