Sql 我试图编写一个触发器,在插入值之前搜索该列中的重复项,以便在该列中不能有相同的值
我是SQL 2008 R2新手,我正在尝试编写一个触发器,在插入值之前在名为AlphanumericCol的列中搜索重复的值,以便在该列中不能有相同的值 到目前为止,我所拥有的: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
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?如果插入到表中,则触发器会在重复的情况下引发错误,否则不会执行任何操作。触发器不会“替换”插入,它会在插入之外执行其他操作。还有其他类型的触发器可以进行额外的插入(日志记录、审计),但我认为这里的情况并非如此。这是否阐明了触发的目的?顺便说一句,唯一约束的问题是什么,听起来它就像手套一样适合您的场景?