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

Ada*_*ice 101 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 //
Run Code Online (Sandbox Code Playgroud)

但我该怎么办

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table` AND
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....
Run Code Online (Sandbox Code Playgroud)

有可能,还是我必须使用2个触发器?两者的代码相同,我不想重复它.

der*_*ert 118

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

  • 您可以为不熟悉语法的我们提供一个玩具示例吗? (2认同)
  • @Zxaos:我建议从http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html(其中包括一些示例)开始,并在需要时询问您自己的问题. (2认同)
  • 遗憾的是我们不能像在Oracle中那样使用AND/OR运算符,甚至更多的时候我们也无法通过参数将整个变量OLD和NEW传递给一个过程.我的代码将> 2x (2认同)

Al *_*iwa 44

为了响应@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 ;
Run Code Online (Sandbox Code Playgroud)

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 ;
Run Code Online (Sandbox Code Playgroud)

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 ;
Run Code Online (Sandbox Code Playgroud)

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


Jef*_*son 12

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