SQL Server触发器:删除重复然后插入

时间:2015-08-31 15:01:35

标签: sql sql-server sql-server-2008 triggers

你好我正在尝试创建一个历史表..我的代码几乎可以正常工作,但我的报告查询计算具有相同列值的行的总和(x_id)

现在我想创建一个首先删除旧行的触发器 (例如,第1行的值为(5x,100))

然后我的触发器将插入(5x,200),(5x,300)

我想在插入my(5x,200)和(5x,300)之前先删除(5x,100)列

我尝试在我的DELETE之前在我的触发器中放置一个INSERT语句,但最终只在我的历史记录表中插入了一行,它还删除了除最后一行之外新添加的行。

如果重要,我的触发器为AFTER UPDATEDELETE

此外,table1table1_hist具有完全相同的列定义。

 CREATE TRIGGER trig_table1_hist
 ON table1
 AFTER UPDATE, DELETE
 AS
     DELETE FROM table1_hist 
     WHERE table1_hist.t_id IN (SELECT t_id FROM inserted)

     INSERT INTO table1_hist 
        SELECT * 
        FROM inserted

我尝试了这个但是它也用相同的主键删除了新添加的行。现在,如果我不删除,我的表将有(5x,100)(5x,200)(5x,300)但我需要(5x,100)消失,因为我的报告仍然包括(5x, 100)

2 个答案:

答案 0 :(得分:0)

您可能在表1中插入2行,因此触发器被触发2次(第一行删除(5x,100),第二次删除(5x,200))

我不知道您在哪种情况下,但我建议您添加一个列,其中包含您在table1_hist中插入数据的日期,并根据这些日期显示报告。删除历史表中的行通常是个坏主意

答案 1 :(得分:0)

您需要逻辑来检查它是UPDATE还是DELETE。删除将使用伪表deleted而不是inserted。例如:

CREATE TRIGGER trig_table1_hist
  ON table1
  AFTER UPDATE,DELETE

 AS
 IF (EXISTS(SELECT 1 from deleted))
 BEGIN
    DELETE FROM table1_hist where table1_hist.t_id IN (SELECT t_id FROM   deleted)
    INSERT INTO table1_hist 
    SELECT * FROM deleted
ENd

IF (EXISTS(SELECT 1 FROM inserted))
 BEGIN
    DELETE FROM table1_hist where table1_hist.t_id IN (SELECT t_id FROM   inserted)
    INSERT INTO table1_hist 
    SELECT * FROM inserted
ENd

除此之外,你需要确保使用一个唯一的密钥 - 为table1选择主键,不要使用可能重复或不重复的字段 - 否则,你最终会产生意想不到的后果(比如将错误的行放入历史表中)。