首页 > 解决方案 > 如何在其他列的基础上添加约束

问题描述

在我的桌子上有两列。第一个是名称(varchar),第二个是状态(数字)。我想添加一个约束,以便名称字段是唯一的,但除非状态的值为 2。如果状态的值为 2,则允许重复名称。

标签: sql-server

解决方案


欢迎来到堆栈溢出。发布问题时,尤其是与 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;

推荐阅读