【问题标题】:SQL Server constraint to permit "two unique" values允许“两个唯一”值的 SQL Server 约束
【发布时间】:2014-11-17 11:27:59
【问题描述】:

我有一张这样的桌子:

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 做到这一点吗?也许是检查约束?

解决方案:

-- 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) )

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 更新:检查(dbo.FunctionCheckValidityOfValue() = 1)
    • 您需要传入fk_id,如果您让函数返回该值的计数,您可以将&lt;= n 逻辑放在表定义中。
    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 2010-11-23
    • 2011-08-30
    • 1970-01-01
    • 2011-01-11
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多