2

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

它应该删除第二行。

4

2 回答 2

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和足以唯一标识行bc我已经重命名了触发器和程序,以更准确地反映它们的相关内容/时间;del并不是所有东西都适合作为调用 on 的前缀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。)

于 2012-10-19T20:36:37.780 回答
1

Why not just use SELECT UNIQUE to avoid inserting duplicate values, or to remove duplicate values which already exist in the table?

于 2012-10-19T22:21:02.487 回答