如果可以在其中插入重复项,则您的表格设计错误。您应该有一个独特的约束,以确保它不会发生。
假设由于某种原因您无法修复表格,那么:
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
并不是所有东西都适合作为调用 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
。)