Informix触发器用于删除一条记录

时间:2012-10-19 16:53:41

标签: sql informix

当我执行任务时,我的表中会插入两行,即。复制。我需要使用after insert触发器删除副本。我需要从那些删除一个重复的记录2.我需要这样的东西

CREATE TRIGGER del_rec
INSERT ON table1
AFTER(EXECUTE PROCEDURE del_proc());

CREATE PROCEDURE del_proc()

//check field a,b,c of this table already exists for this id. if yes delete the second one

END PROCEDURE;

例如:

table 1:

a b c d e
1 1 1 2 2
1 1 1 2 2

它应该删除第二行。

2 个答案:

答案 0 :(得分:1)

如果可以在其中插入重复项,则表格设计错误。你应该有一个独特的约束,确保它不会发生。

假设您因某些原因无法修复表格,那么:

CREATE TRIGGER ins_table1
    INSERT ON table1 REFERENCING NEW AS new
    FOR EACH ROW (EXECUTE PROCEDURE ins_table1(new.a, new.b, new.c));

这假设列abc足以唯一标识该行。我已经重新命名了触发器和程序,以更准确地反映它们何时/何时相关; del并不适合作为INSERT上调用的内容的前缀。

CREATE PROCEDURE ins_table1(new_a INTEGER, new_b INTEGER, new_c INTEGER)

    DEFINE l_a LIKE table1.a;

    FOREACH SELECT a INTO l_a
              FROM table1
             WHERE a = new_a AND b = new_b AND c = new_c
       RAISE EXCEPTION -271, -100;
    END FOREACH;

END PROCEDURE;

为插入的每一行调用此方法。如果SELECT语句返回一行,它将进入FOREACH循环的主体,因此将引发异常并且INSERT将以一个或多或少的适当错误中止(-271无法在表中插入新行; - 100 ISAM错误:具有唯一键的记录的重复值。

如果您尝试使用AFTER触发器进行此验证,则必须扫描整个表格以查看是否存在重复项,而不是仅仅针对插入的单个组合键。请注意,通常,INSERT可以有多行(想想INSERT INTO Table SELECT * FROM SomeWhereElse)。性能差异将是戏剧性的! (您对AFTER触发器的查询必须类似于SELECT a, b, c FROM table1 GROUP BY a, b, c HAVING COUNT(*) > 1。)

答案 1 :(得分:1)

为什么不使用SELECT UNIQUE来避免插入重复值,或者删除表中已存在的重复值?