mysql - 每行

时间:2012-06-28 00:00:20

标签: mysql triggers

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

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

我在哪里拨打这个电话?

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

谢谢,

1 个答案:

答案 0 :(得分:3)

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

简而言之,你无法做到这一点,因为MySQL不知道你是在插入1000个值还是只插入一个值。即使您从一个单一的陈述中触发它们,它们也是各自独立的事件。

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

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

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

但是您可以克服过滤限制,例如:

CREATE FUNCTION x(id INTEGER) ...

SELECT x(object_id) FROM objects WHERE ...

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