我有两张表:
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(值)不是唯一的,就拒绝添加更多的同义词。
因此,例如
primarytable:
-------------
value | type
-------------|---------
Toyota F-150 | carmake
GMC Canyon | carmake
secondarytable:
---------------
value | synonym
-------------|---------------
Toyota F-150 | toyota pickup
GMC Canyon | gmc pickup是可以的,但是
primarytable:
-------------
value | type
-------------|----------------
Toyota F-150 | carmake
GMC Canyon | carmake
secondarytable:
---------------
value | synonym
-------------|-----
Toyota F-150 | pickup
GMC Canyon | pickup不应该是ok (同义词+值的关联类型不是唯一的)。
我试着做一个函数
create function uf_getTypeForValue(@value nvarchar(50))
returns nvarchar(50)
as
begin
return (select type from primarytable p where p.value = @value)
end然后将唯一约束添加到第二个表中:
alter table secondarytable add constraint uc_secondarytable_synonym_unique_for_type
unique (synonym, uf_getTypeForValue(value))但是,我在此Incorrect syntax near '('.上收到错误消息
我以前已经成功地从check-constraints调用了函数,所以显然我不能使用唯一约束来做到这一点?
有没有我需要知道的简单的语法技巧,或者我如何才能用另一种方式来完成这一点?
发布于 2014-11-08 06:10:13
从语法here来看,我认为您只能对唯一约束执行列操作。但是,我看到"CHECK“约束可以包含逻辑表达式。所以你可以用它来完成它。在函数内部执行行数查询,如下所示:
--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;然后,您可以在检查约束中使用它,如下所示:
ALTER TABLE secondarytable
ADD CONSTRAINT uc_secondarytable_synonym_unique_for_type
CHECK (dbo.NumberOfSimilarRows(synonym, value) <= 1 );https://stackoverflow.com/questions/26650963
复制相似问题