0

考虑以下场景假设数据库表中有三个字段

------------------------------------------
PrmiaryKey | Column A | Column B
-----------------------------------------

我需要强制要求 B 列中的值应该具有 A 列的唯一值

例子

Col B   Col A

12         13        (OK)    
14         15        (OK)      
15         16        (OK)    
12         13        (OK)    
15         16        (OK)    
14         17        (not OK)

由于值 14 以前在 B 列下具有值 15。因此它的值不应与 15 不同。我需要从数据库端强制执行此行为。是否有一个特殊的约束我需要解决这个问题

提前致谢。

4

2 回答 2

0

您可以尝试放置一个CHECK CONSTRAINT

CREATE FUNCTION dbo.CheckDuplicateEntry(@id INT, @colA INT, @colB INT)
RETURNS INT
AS
BEGIN
    DECLARE @ret INT

    IF EXISTS(SELECT 1 FROM Test WHERE ID <> @id AND ColB = @colB) BEGIN
        IF EXISTS(SELECT 1 FROM Test WHERE ID <> @id AND ColB = @colB AND ColA = @colA) BEGIN 
            SET @ret =  1
        END
        ELSE BEGIN
            SET @ret = 0
        END
    END
    ELSE BEGIN
        SET @ret = 1
    END

    RETURN @ret
END

ALTER TABLE [TableName]
  ADD CONSTRAINT ConstCheckDuplicateEntry 
  CHECK (dbo.CheckDuplicateEntry(ID, ColA, ColB) = 1);
于 2015-03-04T05:47:07.740 回答
0

约束作用于行内的字段。考虑其他行中的值的唯一“约束”是唯一约束......实际上只是创建了一个唯一索引。仅使用约束无法强制执行您的要求。你必须使用触发器。

create trigger TableTrigger_AIU
   on  Table
   after insert, update
as begin
declare
    @Dups   int;
    set NoCount on;

    select  @Dups = count(*)
    from    Inserted i
    join    Table t
        on  t.ColA = i.ColA
        and t.ColB <> i.ColB;

    if @Dups > 0 begin
        raise holy_blue_well_you_know;
    end;
end;
于 2015-03-04T05:27:39.360 回答