3

我写了一个插入触发器。呜。

下一步是我想在触发器运行后运行查询或过程。所以不是针对插入的每条记录,而是在插入之后。

我在哪里打这个电话?

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$$

谢谢,

4

1 回答 1

3

MySQL 触发器语法是有限的。您不能在同一张表上有多个触发器。您不能拥有数据库级触发器。

简而言之,您不能这样做,因为 MySQL 不知道您是插入 1000 个值还是仅插入一个。即使您从单个语句触发它们,它们也是独立的事件。

FOR EACH ROWCREATE TRIGGER语法的固定部分,它不是可选的。

当我遇到同样的问题时,我实现了存储函数并使用这些函数来执行插入和更新代码。

函数和存储过程的限制很多,例如无法向它们传递可变数量的参数(就像您可以传递给插入/更新一样)或无法将 WHERE 子句传递给它们以便它们可以过滤它们正在影响。

但是您可以像这样克服过滤限制:

CREATE FUNCTION x(id INTEGER) ...

SELECT x(object_id) FROM objects WHERE ...

我不确定 MySQL 是否会像在现场执行函数并拥有不需要在函数中重新选择它的对象数据一样优化这一点。但我认为它不会......它认为函数内的更新查询照常运行。

于 2012-06-28T00:05:03.387 回答