插入触发器以防止重复

时间:2012-07-05 15:28:14

标签: sql triggers insert

我有一个表,其中AutoIdentity列为PK,nvarchar列为“IdentificationCode”。我想要的只是在插入一个新行时,它将在表中搜索任何预先存在的IdentificationCode,如果找到任何已回滚的事务。

我写了下面的触发器:

ALTER trigger [dbo].[Disallow_Duplicate_Ids] 
on [dbo].[tbl1]
for insert
as
if ((select COUNT(*) from dbo.tbl1 e , inserted i where e.IdentificationNo = i.IdentificationNo ) > 0)
begin
RAISERROR('Multiple Ids detected',16,1)
ROLLBACK TRANSACTION
end

但是当插入新行时,即使没有这样的IdentificationCode,它也总是会触发回滚。

任何人都可以帮助我吗?

感谢

2 个答案:

答案 0 :(得分:3)

正如@Qpirate所提到的,你应该对列进行某种UNIQUE约束。这可能更强大'而不是使用触发器,因为有那些方法来禁用它们 此外,隐式连接语法(逗号分隔的FROM子句)被视为SQL反模式 - 如果可能,请始终明确声明您的连接。

我怀疑您的错误是因为您的触发器似乎是AFTER触发器,并且您检查表中是否有任何(非零)行;换句话说,触发器(可能)“失败”' INSERT ,因为INSERT。将其更改为BEFORE(或INSTEAD OF)触发器,或将计数更改为>= 2可能会解决问题。

如果没有看到您的插入声明,则无法确定,但(特别是如果您使用的是SP),您可以在INSERT语句中检查是否存在如果没有插入行,则抛出错误(或做其他事情) 例如,以下内容:

INSERT INTO tbl1 (identificationCode, *otherColumns*)
VALUES (@identificationCode, *otherColumns)
WHERE NOT EXISTS (SELECT '1'
                  FROM tbl1
                  WHERE identificationCode = @identificationCode)

将返回一个代码,表示未找到行' (插入等;几乎每个系统都是SQLCODE = 100)如果identificationCode已经存在。

答案 1 :(得分:0)

使用EXISTS检查IdentificationCode是否已存在。

If EXISTS (Select * from tbl1 where IdentificationCode = @IdentificationCode )
BEGIN
//do something
END
Else
BEGIN
//do something
END