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

时间:2009-08-23 10:17:15

标签: mysql triggers

是否可以为表的插入和更新事件触发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个触发器?两者的代码相同,我不想重复它。

3 个答案:

答案 0 :(得分:112)

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

答案 1 :(得分:42)

为了响应@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 ;

您注意到,当我完成定义触发器和过程的业务时,我会小心地恢复分隔符。

答案 2 :(得分:12)

遗憾的是,在INSERT或UPDATE 描述之后我们无法在MySQL 中使用,就像在Oracle中一样