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

是否有可能为表的插入和更新事件触发 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
.....

有可能吗,还是我得用两个触发器?两者的代码是一样的,我不想重复。

122547 次浏览

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

不幸的是,我们不能像 Oracle 那样在 MySQL插入或更新后描述中使用

为了响应@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. 确定这两个触发器使用的共同程序:

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 ;

您会注意到,当我完成定义触发器和过程的工作时,我会注意恢复分隔符。