代码之家  ›  专栏  ›  技术社区  ›  VS1SQL

触发器在数据不存在时将其识别为重复数据

  •  0
  • VS1SQL  · 技术社区  · 7 年前

    我在SQL Server中有一个触发器:

    CREATE TRIGGER MyTrigger ON [dbo].[practiseduplicates]   
    AFTER INSERT
    AS
        IF EXISTS (SELECT * 
                   FROM [practiseduplicates] t 
                   INNER JOIN inserted i ON i.[money] = t.[money] 
                                         AND i.[Name] = t.[Name] 
                                         AND i.[year month] = t.[year month])
        BEGIN
            ROLLBACK
            RAISERROR ('Duplicated Data', 16, 1);
        END
    

    然后插入这些值(已在数据表中):

    insert into [practiseduplicates]
    values ('2017-02', 'buzzlightyear', '10.09')
    

    例如

    '2056-12', 'mr potato head', '12345.09'
    

    错误消息仍然会弹出,实际上它应该刚刚将数据插入表中,有人知道为什么会这样吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   DVT    7 年前

    引用您的问题

    当我单击execute时,我希望会弹出错误消息…它确实如此,

    简而言之,您正在创建一个 插入后 运行插入后

        2
  •  0
  •   VS1SQL    7 年前

    ALTER TABLE [dbo].[practiseduplicates]    
    ADD CONSTRAINT [constraintforduplicates] UNIQUE NONCLUSTERED
    ( [column name],
    [column name], etc etc
    )
    

    这将停止使用您在constraint语句中声明的列作为要比较的数据的任何重复,并标记它们是否重复,并且不会将数据插入表中。

    注意,语句中的列本身有900字节的约束。例如,如果有varchar(max)列,约束将不会运行,因为它可以执行的最大值是900字节。在我的脚本中,我放置了varchar(800)。