0

我有這樣的一個表:SQL服務器的限制,允許「兩個唯一」值

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].[CheckParent](@parent_id int) 
RETURNS bit 
AS 
BEGIN 

    DECLARE @result bit 
    DECLARE @count int 

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

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

    RETURN @result 

END 

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

回答

3

你應該創建一個調用函數的檢查約束;如果當前值(正在檢查的當前值)有2個或更少的值,則函數返回1。

檢查約束應該是這樣的檢查(dbo.FunctionCheckValidityOfValue = 1)

+0

更新:檢查(dbo.FunctionCheckValidityOfValue()= 1) –

+1

你需要在'fk_id'通過,如果你讓函數返回該值的計數可以將'<= n'邏輯放在表定義中。 –