【问题标题】:Ensuring no duplicate records being created in a table per particular column value确保每个特定列值都不会在表中创建重复记录
【发布时间】:2015-03-04 04:55:21
【问题描述】:

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

------------------------------------------
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 不同。我需要从数据库端强制执行此行为。是否有一个特殊的约束我需要解决这个问题

提前致谢。

【问题讨论】:

  • 您可以使用触发器,使用Insert触发器检查A列中插入的值是否满足您的要求,然后继续执行。

标签: sql sql-server database concurrentmodification mssql-jdbc


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

    你可以试试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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多