用于插入和更新的MySQL Fire触发器


110

是否可以为表的插入和更新事件触发mysql触发器?

我知道我可以做到以下几点

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW
BEGIN
.....
END //

CREATE TRIGGER my_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....
END //

但是我该怎么办

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table` AND
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....

是否可以,或者我必须使用2个触发器?两者的代码相同,我不想重复。

Answers:


126

您必须创建两个触发器,但是您可以将通用代码移动到过程中并使它们都调用过程。


3
您能为不熟悉语法的我们提供一个玩具示例吗?
Zxaos 2011年

3
@Zxaos:我建议用开始dev.mysql.com/doc/refman/5.1/en/create-procedure.html(其中包括一些例子),并询问是否需要你自己的问题(一个或多个)。
derobert

2
遗憾的是,我们无法像在Oracle中那样使用AND / OR运算符,甚至在我们也无法将参数OLD和NEW传递给过程时更是如此。我的代码将> 2x
Mikel

这对于从不妥协两次编写代码的开发人员很有用
。.– Sayka

1
@luismartingil调用过程与内联过程可能会产生一些额外的开销。但是作为交换,您可以更轻松地进行维护,并保证两个触发器的代码不会意外地分开。
德罗伯特

46

响应@Zxaos的请求,由于我们没有MySQL触发器的AND / OR运算符,因此从您的代码开始,下面是一个完整的示例,以实现相同的效果。

1.定义INSERT触发器:

DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE DEFINER=root@localhost TRIGGER my_insert_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW

BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    -- NEW.id is an example parameter passed to the procedure but is not required
    -- if you do not need to pass anything to your procedure.
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

2.定义UPDATE触发器

DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//

CREATE DEFINER=root@localhost TRIGGER my_update_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

3.定义这两个触发器使用的通用PROCEDURE:

DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//

CREATE DEFINER=root@localhost PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255))
READS SQL DATA
BEGIN

    -- Write your MySQL code to perform when a `table` row is inserted or updated here

END//
DELIMITER ;

您注意到,在完成定义触发器和过程的业务后,我会小心地恢复定界符。


1
什么是IN table_row_id VARCHAR(255)在这种情况下?我的意思是,您如何定义要插入或更新的行?
Vato

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.