如何为SQL Server表添加删除timestamp重复数据的触发器
自动删除重复Timestamp的SQL Server触发器方案
以下提供两种触发器实现方式,可根据需求选择:
方式一:插入后清理重复记录(AFTER INSERT触发器)
先插入所有数据,再删除每个timestamp对应的重复项,保留第一条记录:
CREATE TRIGGER trg_table1_CleanDuplicateTimestamp ON [dbo].[table1] AFTER INSERT AS BEGIN SET NOCOUNT ON; -- 仅针对刚插入的记录中的重复项清理,避免全表扫描 WITH DuplicateRecords AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY timestamp ORDER BY timestamp) AS RowSequence FROM [dbo].[table1] WHERE timestamp IN (SELECT timestamp FROM inserted) ) DELETE FROM DuplicateRecords WHERE RowSequence > 1; END GO
方式二:直接避免插入重复记录(INSTEAD OF INSERT触发器)
插入前过滤重复的timestamp数据,只写入不重复的记录,性能更优,不会产生临时重复数据:
CREATE TRIGGER trg_table1_PreventDuplicateTimestamp ON [dbo].[table1] INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; -- 过滤插入批次内的重复项,同时跳过表中已存在的timestamp记录 INSERT INTO [dbo].[table1] (predictions, timestamp, train1, train2) SELECT predictions, timestamp, train1, train2 FROM ( SELECT predictions, timestamp, train1, train2, ROW_NUMBER() OVER (PARTITION BY timestamp ORDER BY (SELECT NULL)) AS RowSequence FROM inserted ) AS FilteredInsertData WHERE RowSequence = 1 AND NOT EXISTS ( SELECT 1 FROM [dbo].[table1] t WHERE t.timestamp = FilteredInsertData.timestamp ); END GO
补充说明
- 方式一适合需要保留插入操作原始记录(即使重复)再清理的场景,但会有短暂的重复数据存在于表中。
- 方式二更推荐,从根源上避免重复数据写入,减少不必要的IO操作。
- 若需按特定规则保留某条重复记录(比如最新插入的),可修改
ROW_NUMBER()中的ORDER BY子句,例如改为ORDER BY (SELECT NEWID())或按主键排序。
内容的提问来源于stack exchange,提问作者MMV
相关产品推荐
相关产品推荐

