如果一个值是另一个值的前缀,则阻止输入该值
Prevent a value from being entered if it's a prefix of another value
如何防止输入的值是同一列中另一个值的前缀?例如,如果 MyTable.NumberPrefix
已经包含 abc
,则无法添加 ab
。
我的第一次尝试(如下)是使用索引视图。但是无法在使用派生 table 的视图上创建唯一索引(而且我不知道如何在没有它的情况下编写视图)。
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
将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)
如何防止输入的值是同一列中另一个值的前缀?例如,如果 MyTable.NumberPrefix
已经包含 abc
,则无法添加 ab
。
我的第一次尝试(如下)是使用索引视图。但是无法在使用派生 table 的视图上创建唯一索引(而且我不知道如何在没有它的情况下编写视图)。
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
将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)