触发以防止插入两列的重复数据

WiX*_*XeY 10 sql sql-server sql-server-2008

我正在努力SQL Server 2008R2,我有下表

ID     Name     date
 1     XYZ      2010
 2     ABC      2011
 3     VBL      2010
Run Code Online (Sandbox Code Playgroud)

现在我想阻止插入,如果我有一个数据虽然ID不同但数据存在

 ID    Name     date
  4    ABC      2011
Run Code Online (Sandbox Code Playgroud)

请指导我如何编写此触发器.

Roc*_*lan 20

像这样的东西:

CREATE TRIGGER MyTrigger ON dbo.MyTable
AFTER INSERT
AS

if exists ( select * from table t 
    inner join inserted i on i.name=t.name and i.date=t.date and i.id <> t.id)
begin
    rollback
    RAISERROR ('Duplicate Data', 16, 1);
end
go
Run Code Online (Sandbox Code Playgroud)

这只是插入,你可能也想考虑更新.

更新

一种更简单的方法是在表上创建一个唯一约束,这也将强制执行更新,并消除对触发器的需要.做就是了:

ALTER TABLE [dbo].[TableName]    
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED
(
    [Name], [Date]
)
Run Code Online (Sandbox Code Playgroud)

然后你会做生意.

  • 如果您需要使用触发器方法(例如,因为您需要自定义错误消息),您还需要检查您是否意外加入了插入的刚刚插入的相同记录.我总是找到一个副本,直到我将相应的"i.id <> t.id"添加到on子句. (4认同)
  • 唯一约束的问题可能是它的最大长度(900B) (2认同)