当我执行任务时,我的表中会插入两行,即。复制。我需要使用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
它应该删除第二行。
答案 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));
这假设列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
。)
答案 1 :(得分:1)
为什么不使用SELECT UNIQUE
来避免插入重复值,或者删除表中已存在的重复值?