如何创建表约束以防止跨两列的重复值?

Eri*_*air 3 sql constraints alter-table

我有下表:

CREATE TABLE [dbo].[EntityAttributeRelship](
    [IdNmb] [int] IDENTITY(1,1) NOT NULL,
    [EntityIdNmb] [int] NOT NULL,
    [AttributeIdNmb] [int] NOT NULL,
    [IsActive] [bit] NOT NULL CONSTRAINT [DF_EntityAttributeRelship_IsActive]  DEFAULT ((0)),
CONSTRAINT [PK_EntityAttributeRelship] PRIMARY KEY CLUSTERED 
([IdNmb] ASC) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

表中的一部分数据看起来像这样:

IdNmb    EntityIdNmb    AttributeIdNmb  IsActive
1        22             7               0
2        22             8               0
3        22             9               0
4        22             10              1
Run Code Online (Sandbox Code Playgroud)

我想添加一个约束,以确保没有人添加或更新记录以使IsActive = 1,如果已存在EntityIdNmb的记录,其中IsActive = 1.

我该怎么做呢?

Lie*_*ers 6

如果您使用的是SQLServer,则可以创建聚簇索引视图.

CREATE VIEW dbo.VIEW_EntityAttributeRelship WITH SCHEMABINDING AS
SELECT EntityIdNmb 
FROM dbo.EntityAttributeRelship
WHERE IsActive = 1
GO

CREATE UNIQUE CLUSTERED INDEX UIX_VIEW_ENTITYATTRIBUTERELSHIP 
  ON dbo.VIEW_EntityAttributeRelship (EntityIdNmb)
Run Code Online (Sandbox Code Playgroud)

这确保了表中只有一个EntityIdNmb,IsActive = 1.