You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:53:25