首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用用户定义函数的唯一约束

调用用户定义函数的唯一约束
EN

Stack Overflow用户
提问于 2014-10-30 18:47:12
回答 1查看 742关注 0票数 2

我有两张表:

create table primarytable ( value nvarchar(50) not null primary key type not null ) create table secondarytable ( value nvarchar(50) not null, synonym nvarchar(50) not null, constraint pk_secondarytable primary key (value, synonym) )

因此,每个值可以有许多同义词。我想要做的是,如果synonym+gettypeforvalue(值)不是唯一的,就拒绝添加更多的同义词。

因此,例如

代码语言:javascript
复制
primarytable:
-------------
value        | type
-------------|---------
Toyota F-150 | carmake
GMC Canyon   | carmake

secondarytable:
---------------
value        | synonym
-------------|---------------
Toyota F-150 | toyota pickup
GMC Canyon   | gmc pickup

是可以的,但是

代码语言:javascript
复制
primarytable:
-------------
value        | type
-------------|----------------
Toyota F-150 | carmake
GMC Canyon   | carmake

secondarytable:
---------------
value        | synonym
-------------|-----
Toyota F-150 | pickup
GMC Canyon   | pickup

不应该是ok (同义词+值的关联类型不是唯一的)。

我试着做一个函数

代码语言:javascript
复制
create function uf_getTypeForValue(@value nvarchar(50))
    returns nvarchar(50)
as
begin
    return (select type from primarytable p where p.value = @value)
end

然后将唯一约束添加到第二个表中:

代码语言:javascript
复制
alter table secondarytable add constraint uc_secondarytable_synonym_unique_for_type
unique (synonym, uf_getTypeForValue(value))

但是,我在此Incorrect syntax near '('.上收到错误消息

我以前已经成功地从check-constraints调用了函数,所以显然我不能使用唯一约束来做到这一点?

有没有我需要知道的简单的语法技巧,或者我如何才能用另一种方式来完成这一点?

EN

回答 1

Stack Overflow用户

发布于 2014-11-08 06:10:13

从语法here来看,我认为您只能对唯一约束执行列操作。但是,我看到"CHECK“约束可以包含逻辑表达式。所以你可以用它来完成它。在函数内部执行行数查询,如下所示:

代码语言:javascript
复制
--drop function NumberOfSimilarRows
CREATE FUNCTION NumberOfSimilarRows(@synonymToCheck nvarchar(50), @valueToCheck nvarchar(50))
RETURNS int
AS 
BEGIN
   DECLARE @rowcount int
   SELECT @rowcount = COUNT(*) FROM secondarytable WHERE synonym = @synonymToCheck and value = dbo.uf_getTypeForValue(@valueToCheck)
   RETURN @rowcount
END;

然后,您可以在检查约束中使用它,如下所示:

代码语言:javascript
复制
ALTER TABLE secondarytable
ADD CONSTRAINT uc_secondarytable_synonym_unique_for_type 
CHECK (dbo.NumberOfSimilarRows(synonym, value) <= 1 );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26650963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档