【问题标题】:Informix trigger for deleting one record删除一条记录的 Informix 触发器
【发布时间】:2012-10-19 16:53:41
【问题描述】:

当我执行一项任务时,我的表中会插入两行,即。复制。我需要使用插入后触发器删除重复项。我需要从那些 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

它应该删除第二行。

【问题讨论】:

  • 为什么不对表做唯一性约束,保证不能插入重复行?让 DBMS 拒绝该值要比事后检查表中是否有任何重复的行集要容易得多,尤其是因为删除一对相同的行中的一个很困难。

标签: sql informix


【解决方案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));

这假定列 a、b 和 c 足以唯一标识行。我重命名了触发器和程序,以更准确地反映它们的相关内容/时间; 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。)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多