SQL Server中具有相同insert语句的重复条目

时间:2014-01-31 11:04:24

标签: sql-server-2008-r2

我在SQL Server 2008 R2中遇到重复条目很困难。由于程序的性质,我被告知独特的约束不是一种选择。

有人可以帮助我,因为我尝试了一个For Insert Trigger但没有运气。

表格结构:

col1 - identity
col2 - filename
col3 - date
col4 - filetype
col5 - process
col6 - userid
col7 - info

当我第一次运行此insert时,它会输入两个条目。我不想要的是:

insert into table(filename, filetype,process, userid)
values
  ('test9','import','view','tester'),
  ('test9','import','view','tester')

条目现在在表中两次,唯一的区别是标识列。

Identity     Filename   Date          Filetype     Process    Userid    Info
17           Test9      2014-01-31    Import       View       test      null
18           Test9      2014-01-31    Import       View       test      null

当我第二次运行完全相同的插入时,它不会插入,因为它然后将其视为重复。为什么它第一次没有看到它是重复的?

这是我创建的触发器:

Create trigger check_duplicates
on table
for insert
as 
  if not exist (select p.filename, p.date
                from table p, inserted i
                where p.filename = i.filename and p.date = i.date)
   insert into table
   select filename, date, filetype, process, userid, info
   from inserted
else 
  raiserror('Duplicate file exist',16,1)

rollback
end

谢谢

1 个答案:

答案 0 :(得分:1)

您还必须检查插入行本身是否存在重复项,因此表扫描是不够的。您可以将COUNT(*)..COUNT(DISTINCT FileName,Date)FROM INSERTED进行比较。

您还必须将FOR INSERT替换为INSTEAD OF INSERT

试试这个:

CREATE trigger [dbo].[check_duplicates]
on [dbo].[TableName]
INSTEAD OF INSERT
as 
IF NOT EXISTS 
    (
        SELECT 1 
        FROM dbo.TableName T 
        INNER JOIN INSERTED I 
        ON T.FileName= I.FileName AND T.Date= I.Date
    )
AND (SELECT COUNT(*) FROM INSERTED) =
    (SELECT COUNT(DISTINCT CHECKSUM(FileName, Date)) FROM INSERTED)
BEGIN
    INSERT INTO dbo.TableName 
        SELECT FileName, Date, filetype, process, userid, info 
        FROM INSERTED
END
ELSE
BEGIN
    ROLLBACK
    RAISERROR('Duplicate file exist',16,1) 
END 

但是,您还必须创建更新触发器。

修改:这是 Demo