SQL Server:仅针对特定值的唯一性

时间:2018-02-20 15:40:42

标签: sql-server

我正在努力解决这个问题。欢迎编辑:

我有一个SQL Server表(PlanID,PlanDesc,PlanType),其中PlanID是PK。对于列PlanType - 我希望它具有只能为1个PlanID分配PlanType值“AP”的属性。但是,允许为许多PlanID分配任何其他PlanType值。

所以这样的事情是有效的:

INSERT INTO MyTable VALUES (1, 'Plan A', OP)
INSERT INTO MyTable VALUES (2, 'Plan B', OP)
INSERT INTO MyTable VALUES (3, 'Plan C', AP)
INSERT INTO MyTable VALUES (4, 'Plan D', LP)
INSERT INTO MyTable VALUES (5, 'Plan E', LP)

但是,一旦我尝试使用PlanType AP插入(或更新)任何其他计划,如果现有计划已经具有PlanType AP,则会失败。

有没有办法在DB结构中完成这种类型的约束。或者我唯一的选择是仔细地将这个逻辑编码到应用程序中?

2 个答案:

答案 0 :(得分:3)

您可以创建过滤索引:

create unique index only_one_plantype on MyTable (plantype) 
where plantype = 'AP';

答案 1 :(得分:1)

您可以在表格上创建触发器来执行此操作:

CREATE TRIGGER tr_MyTable_AP
ON MyTable FOR INSERT
AS
    IF (SELECT COUNT(*) FROM MyTable WHERE PlanType = 'AP') > 1
        ROLLBACK TRANSACTION

如果您尝试使用PlanType' AP'并且数据库中已经有一个你最终会得到:

Msg 3609, Level 16, State 1, Line 35
The transaction ended in the trigger. The batch has been aborted.

希望这有帮助。