我写了一个插入触发器。宇。
下一步是我想在触发器运行后运行查询或过程。所以不是插入的每个记录,而是插入后。
我在哪里拨打这个电话?
DELIMITER $$
DROP TRIGGER /*!50033 IF EXISTS */ triggername $$
CREATE TRIGGER triggername
AFTER INSERT ON tableA
FOR EACH ROW
BEGIN
/*This runs for each insert - I want it to run at the end of the trigger*/
CALL UpdateOtherStuff(NEW.fieldA, NEW.fieldB);
END$$
谢谢,
垫
答案 0 :(得分:3)
MySQL触发器语法有限。您不能在同一个表上拥有多个触发器。您不能拥有数据库级别的触发器。
简而言之,你无法做到这一点,因为MySQL不知道你是在插入1000个值还是只插入一个值。即使您从一个单一的陈述中触发它们,它们也是各自独立的事件。
FOR EACH ROW
是CREATE TRIGGER
语法的固定部分,它不是可选的。
当我遇到同样的问题时,我实现了存储的函数,并使用这些函数来执行插入和更新代码。
函数和存储过程的限制很多,例如无法向它们传递可变数量的参数(就像您可以传递给插入/更新)或者无法将WHERE子句传递给它们以便它们可以过滤他们正在影响的事情。
但是您可以克服过滤限制,例如:
CREATE FUNCTION x(id INTEGER) ...
SELECT x(object_id) FROM objects WHERE ...
我不确定MySQL是否会优化这一点,就像在现场执行函数并拥有对象数据一样,它不需要在函数内重新选择它。但我认为它不...它认为函数内部的更新查询按照惯例运行。