SQL 条件约束过滤器

SQL Conditional CONSTRAINT FILTER

根据以下条件

,我不想在 table 中允许重复项

例如: 我有

ID  Number  AdditionalID
1   458     1234 <-- 458 must be  allow
2   458     1234 <-- 458 must be allow
3   458     123456 <-- 458 must not be allowed because additionalID is different

4, 459 ,123456 <- 这必须是允许的。(正确的)

不知道 "Additional id" 如何允许数字的完整解决方案,可能有几个解决方案。

1.外键

如果可能,在这里使用外键可能是最好的解决方案。

ALTER TABLE YourTable
ADD FOREIGN KEY (AdditionalID) REFERENCES AllowedAdditionalId(AdditionalID);

2。使用函数

进行约束检查
create function dbo.CheckFunction()
returns int
as begin
    return (select 1)
end

alter table YourTable
add constraint chk_CheckFunction
check (dbo.CheckFunction() = 1)

解决此问题的最佳方法是规范化您的数据。目前,您正在存储 相同、单个事实 多个 次。因此,我会将 NumberAdditionalID 之间的这种关系移动到单独的 table1 中,并从当前 [=45] 中删除 AdditionalID =].

但是如果你坚持不改变结构,我们可以用 indexed view:

create table dbo.T (
    ID int IDENTITY(1,1) not null,
    Number int not null,
    AdditionalID int not null
)
go
create view dbo.DRI_T
with schemabinding
as
    select
        Number,
        AdditionalID,
        COUNT_BIG(*) as Cnt
    from
        dbo.T
    group by Number,AdditionalID
go
create unique clustered index IX_DRI_T_UniqueAdditionalIDPerNumber on dbo.DRI_T (Number)
go
insert into T(Number,AdditionalID) values
(458,1234),
(458,1234)
go
insert into T(Number,AdditionalID) values
(458,123456) --<-- This insert fails
go
insert into T(Number,AdditionalID) values
(459 ,123456)

这是如何工作的?我们创建一个视图,其中每个 NumberAdditionalID 列的唯一组合包含一行。但是随后我们声明此视图的键是 just Number 列。实际上,这意味着我们实际上只允许为每个 Number 值存储一个这样的组合。


1在单独的 table 中,Number 将是主键,因此当然只有一个 AdditionalID 可以关联每个Number。事实上,它与此处显示的索引视图非常相似,只是它不需要 Cnt 列,这只是此处需要的,因为它是允许在索引视图中 GROUP BY 的要求。