SQL条件CONSTRAINT过滤器

时间:2018-04-05 08:50:12

标签: sql sql-server constraints filtering sql-server-express

我不想根据以下标准在表格中允许重复

例如: 我有

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&lt; - 必须允许。(正确的)

2 个答案:

答案 0 :(得分:2)

解决此问题的最佳方法是规范化您的数据。目前,您正在存储相同的,单个事实多个次。因此,我会将NumberAdditionalID之间的关系移到单独的表 1 中,并从当前表中删除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列的唯一组合将包含一行。但后来我们声明此视图的关键是只是 Number列。实际上,我们实际上只允许为每个Number值存储一个这样的组合。

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

答案 1 :(得分:1)

不知道“附加ID”如何允许数字的完整解决方案,可能会有几个解决方案。

<强> 1。 Foreing key

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

FindElements()

<强> 2。使用功能

进行检查
ALTER TABLE YourTable
ADD FOREIGN KEY (AdditionalID) REFERENCES AllowedAdditionalId(AdditionalID);