如何添加触发器以删除表中的重复项

How to add a trigger to delete duplicates in table

提问人:MMV 提问时间:5/22/2023 最后编辑:WahlstrommmMMV 更新时间:5/23/2023 访问量:80

问:

嗨,我下面有一张这样的表格:

[dbo].[table1](
    [predictions] [int] NULL,
    [timestamp] [datetime] NULL,
    [train1] [int] NULL,
    [train2] [int] NULL)

我正在使用 dbx job 将数据插入此表。有时我们会得到表中时间戳列的重复项。

我想在数据库中添加一个触发器,以便在发生重复项时删除重复项。

我现在正在手动删除运行下面此查询的重复值。

With duplicates As (Select *, ROW_NUMBER() Over (PARTITION by timestamp Order by timestamp) as Duplicate From table1) select From duplicates Where Duplicate > 1 ;

任何帮助都非常感谢!

sql-server sql-server-2008 触发器 重复项

评论

1赞 javdromero 5/22/2023
创建 AFTER INSERT 触发器。研究一下,如果您有任何问题,请回来。
0赞 Stu 5/22/2023
积极主动并添加约束以防止重复 - 让您的数据自行管理。
0赞 Stu 5/22/2023
您还可以使用触发器来处理批处理中的任何重复项,并仅插入唯一的行。instead of

答:

4赞 Charlieface 5/22/2023 #1

您可以使用鲜为人知的IGNORE_DUP_KEY选项

ALTER TABLE dbo.table1
ADD CONSTRAINT uq_table1_timestamp
  UNIQUE (timestamp)
  WITH (IGNORE_DUP_KEY = ON);

这将自动(且静默地)忽略重复行的插入。

请注意,这不会删除现有的重复项,您首先需要运行:

WITH cte AS (
    SELECT *,
      rn = ROW_NUMBER() OVER (PARTITION BY timestamp ORDER BY timestamp)
    FROM yourTable
)
DELETE cte
WHERE rn > 1;

评论

1赞 M.Ali 5/22/2023
从来不知道这个选项,听起来很酷,但也很危险,数据很可能会丢失,因为它被默默地忽略了IGNORE_DUP_KEY