如何在 Azure SQL 資料庫中設定允許列中有 NULL 值的唯一約束?
SQL Server 的以下解決方法似乎不適用于 Azure SQL:
CREATE UNIQUE NONCLUSTERED INDEX [IX_Email] ON [dbo].[Users]([Email] ASC)
WHERE ([Email] IS NOT NULL);
uj5u.com熱心網友回復:
評論中的錯誤告訴您問題:
違反唯一鍵約束“UQ_Users_5120...”。無法在物件“dbo.Users”中插入重復鍵。重復鍵值為 ()。
首先,請注意錯誤狀態為“UNIQUE KEY Constraint ”,強調我的。不是索引,是約束。另請注意所述約束的名稱:UQ_Users_5120...這不是您創建的物件的名稱(IX_Email)。
您可以使用以下方法復制此問題:
CREATE TABLE dbo.SomeTable (SomeColumn varchar(10) NULL);
GO
--Create a UNIQUE Constraint
ALTER TABLE dbo.SomeTable ADD CONSTRAINT UQ_SomeColumn UNIQUE (SomeColumn);
GO
--Create a filtered unique index
CREATE UNIQUE NONCLUSTERED INDEX UX_SomeColumn_NotNull ON dbo.SomeTable(SomeColumn)
WHERE SomeColumn IS NOT NULL;
GO
--Initial Insert
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES('asdfasd'),
('asdasd'),
(NULL);
GO
--Insert another dupe, non NULL value. Fails
--This violates constraint 'UQ_SomeColumn'
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES('asdfasd');
GO
--Insert another dupe, NULL value. Fails
--This violates constraint 'UQ_SomeColumn'
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES(NULL);
GO
你可以解決這個問題,我放棄你的UNIQUE CONSTRAINT. 我們沒有全名,但對于上面的示例,它將如下所示:
ALTER TABLE dbo.SomeTable DROP CONSTRAINT UQ_SomeColumn;
GO
然后我們可以再次測驗:
--Insert another dupe, non NULL value. Fails
--Cannot insert duplicate key row in object 'dbo.SomeTable' with unique index 'UX_SomeColumn_NotNull'. The duplicate key value is (asdfasd).
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES('asdfasd');
--Insert another dupe, NULL value. Success
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES(NULL);
GO
還要注意,重復值的錯誤現在完全不同了。它提到了唯一索引,而不是唯一鍵約束,并且創建了唯一過濾索引的名稱,而不是其他名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431789.html
標籤:sql sql服务器 tsql 天蓝色 sql 数据库
上一篇:SQL聚合邏輯操作
