是否可以为表的插入和更新事件触发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
您必须创建两个触发器,但您可以将公共代码移动到一个过程中,让它们都调用该过程.
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)
您注意到,当我完成定义触发器和过程的业务时,我会小心地恢复分隔符.
| 归档时间: |
|
| 查看次数: |
91270 次 |
| 最近记录: |