如何防止输入的值是同一列中另一个值的前缀?例如,如果MyTable.NumberPrefix
已包含abc
,则无法添加ab
。
我的第一次尝试(下面)是使用索引视图。但是无法在使用派生表的视图上创建唯一索引(我无法弄清楚如何在没有它的情况下编写视图)。
create view MyTable
with schemabinding
as
select
left(a.NumberPrefix, b.Length) as CommonPrefix
from
dbo.MyTable a
cross join
(
select distinct
len(NumberPrefix) as Length
from
dbo.MyTable
) b
create unique clustered index MyIndex on MyTable (CommonPrefix) --ERROR
一些测试数据:
insert MyTable (NumberPrefix) values ('abc') -- OK
insert MyTable (NumberPrefix) values ('ab') -- Error
insert MyTable (NumberPrefix) values ('a') -- Error
insert MyTable (NumberPrefix) values ('abd') -- OK
insert MyTable (NumberPrefix) values ('abcd') -- Error
答案 0 :(得分:1)
将check constraint
与user defined function
:
create function fnPrefix(@prefix varchar(100))
returns bit
as
begin
if (select count(*) from MyTable
where MyColumn like @prefix + '%' or @prefix like MyColumn + '%') > 1
return 0
return 1
end
然后添加约束:
alter table MyTable
add constraint chkPrefix check(dbo.fnPrefix(MyColumn) = 1)