sql-server - 如何在其他列的基础上添加约束
问题描述
在我的桌子上有两列。第一个是名称(varchar),第二个是状态(数字)。我想添加一个约束,以便名称字段是唯一的,但除非状态的值为 2。如果状态的值为 2,则允许重复名称。
解决方案
欢迎来到堆栈溢出。发布问题时,尤其是与 RDBMS 相关的问题时,理想情况下,您应该提供示例和预期结果或行为。
但是,根据您的描述,您所追求的似乎是一个唯一的过滤索引。这应该让你走上你需要的道路:
USE Sandbox;
GO
CREATE TABLE TestTable([name] varchar(50), [status] int)
CREATE UNIQUE NONCLUSTERED INDEX LiveName_UQ ON TestTable([Name]) WHERE [status] = 1; --Guessed that it would be a 1 instead? Maybe it should be <> 2?
GO
INSERT INTO TestTable VALUES ('John',1); --works
INSERT INTO TestTable VALUES ('Jane',1); --works
INSERT INTO TestTable VALUES ('John',2); --works
INSERT INTO TestTable VALUES ('John',2); --works
INSERT INTO TestTable VALUES ('Jane',1); --fails
GO
SELECT *
FROM dbo.TestTable;
GO
DROP TABLE TestTable;