Sql 我试图编写一个触发器,在插入值之前搜索该列中的重复项,以便在该列中不能有相同的值

Sql 我试图编写一个触发器,在插入值之前搜索该列中的重复项,以便在该列中不能有相同的值,sql,Sql,我是SQL 2008 R2新手,我正在尝试编写一个触发器,在插入值之前在名为AlphanumericCol的列中搜索重复的值,以便在该列中不能有相同的值 到目前为止,我所拥有的: ALTER TRIGGER DUPLICATES ON AMGR_User_Fields_Tbl AFTER INSERT, UPDATE AS Declare @Counter integer Declare @Value integer set @Counter = (Select top 1 Alph

我是SQL 2008 R2新手,我正在尝试编写一个触发器,在插入值之前在名为AlphanumericCol的列中搜索重复的值,以便在该列中不能有相同的值

到目前为止,我所拥有的:

ALTER TRIGGER DUPLICATES
ON  AMGR_User_Fields_Tbl

AFTER INSERT,
  UPDATE
AS

Declare @Counter integer
Declare @Value integer

set @Counter = (Select top 1 AlphanumericCol from AMGR_User_Fields_Tbl order by AlphanumericCol  desc); -- this will bring back the last record
set @Value = @Counter + 1;



IF EXISTS(select top 1 * from AMGR_User_Fields_Tbl order by AlphanumericCol desc)
 BEGIN
  RAISERROR('This row already exists in the table', 16, 1)
  ROLLBACK TRAN
 END;
但似乎不起作用


提前感谢

最好的解决方案可能是:

alter table AMGR_User_Fields_Tbl add constraint ... unique ( AlphanumericCol );
如果由于某种原因无法正常工作,则必须在引发错误之前在表中查找特定值(如果存在一行,则无论AlphanumericCol的值如何,都会出现错误)。我不了解sql server,因此这可能包含错误,但类似于:

ALTER TRIGGER DUPLICATES
    ON  AMGR_User_Fields_Tbl
AFTER INSERT, UPDATE AS
    IF EXISTS(select 1 
              from AMGR_User_Fields_Tbl as x
              join inserted AS y 
                  ON x.AlphanumericCol = y.AlphanumericCol)    
    BEGIN
        RAISERROR('This row already exists in the table', 16, 1)
        ROLLBACK TRAN
    END;

为什么唯一约束不是选项?您需要在
exists
子句中对
@Value
进行某种比较。但是一个
unique
constraint/index确实是一个不错的选择。我尝试了一个独特的约束。。但我需要使用触发器。。。我不知道如何对@value进行比较?如下所示:按字母数字COL desc顺序从AMGR\U User\U Fields\U Tbl中选择@Value?如果插入到表中,则触发器会在重复的情况下引发错误,否则不会执行任何操作。触发器不会“替换”插入,它会在插入之外执行其他操作。还有其他类型的触发器可以进行额外的插入(日志记录、审计),但我认为这里的情况并非如此。这是否阐明了触发的目的?顺便说一句,唯一约束的问题是什么,听起来它就像手套一样适合您的场景?