SQL Server约束允许“两个唯一”值

时间:2014-11-17 11:27:59

标签: sql-server sql-server-2012 constraints check-constraints

我有一张像这样的表:

id   fk_id
1    1
2    1        
3    2        
4    3        
5    3

字段fk_id引用另一个表,我想创建一个约束以允许每个fk_id最多插入两个。

我想阻止这个:

id   fk_id
1    1
2    1        
3    1    <-- FAIL
4    3        
5    3

这是“一对多(但最多2个)”或“一对一(或两个)”的关系 - 我不知道如何命名。

我可以使用MS SQL Server执行此操作吗?也许是CHECK CONSTRAINT?

SOLUTION:

-- function to check if there are more then two rows
CREATE FUNCTION [dbo].[CheckMaxTwoForeignKeys](@check_id int)
RETURNS bit
AS
BEGIN

    DECLARE @result bit
    DECLARE @count int

    SELECT @count = COUNT(*) FROM mytable WHERE fk_id = @check_id 

    IF @count <= 2
        SET @result = 1
    ELSE
        SET @result = 0

    RETURN @result

END

-- create the constraint
ALTER TABLE mytable 
ADD CONSTRAINT CK_MaxTwoFK CHECK ( ([dbo].[CheckMaxTwoForeignKeys]([fk_id])=1) )

1 个答案:

答案 0 :(得分:3)

您应该创建一个调用函数的检查约束;如果当前值(正在检查的当前值)有2个或更少的值,则该函数返回1.

检查约束应该类似于check(dbo.FunctionCheckValidityOfValue = 1)