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)
解决此问题的最佳方法是规范化您的数据。目前,您正在存储 相同、单个事实 多个 次。因此,我会将 Number
和 AdditionalID
之间的这种关系移动到单独的 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)
这是如何工作的?我们创建一个视图,其中每个 Number
和 AdditionalID
列的唯一组合包含一行。但是随后我们声明此视图的键是 just Number
列。实际上,这意味着我们实际上只允许为每个 Number
值存储一个这样的组合。
1在单独的 table 中,Number
将是主键,因此当然只有一个 AdditionalID
可以关联每个Number
。事实上,它与此处显示的索引视图非常相似,只是它不需要 Cnt
列,这只是此处需要的,因为它是允许在索引视图中 GROUP BY
的要求。
根据以下条件
,我不想在 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)
解决此问题的最佳方法是规范化您的数据。目前,您正在存储 相同、单个事实 多个 次。因此,我会将 Number
和 AdditionalID
之间的这种关系移动到单独的 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)
这是如何工作的?我们创建一个视图,其中每个 Number
和 AdditionalID
列的唯一组合包含一行。但是随后我们声明此视图的键是 just Number
列。实际上,这意味着我们实际上只允许为每个 Number
值存储一个这样的组合。
1在单独的 table 中,Number
将是主键,因此当然只有一个 AdditionalID
可以关联每个Number
。事实上,它与此处显示的索引视图非常相似,只是它不需要 Cnt
列,这只是此处需要的,因为它是允许在索引视图中 GROUP BY
的要求。