用于插入和更新的 MySQL Fire Trigger

Posted

技术标签:

【中文标题】用于插入和更新的 MySQL Fire Trigger【英文标题】:MySQL Fire Trigger for both Insert and Update 【发布时间】:2010-11-22 00:55:50 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

你能给我们这些不熟悉语法的人举一个玩具例子吗? @Zxaos:我建议从dev.mysql.com/doc/refman/5.1/en/create-procedure.html 开始(其中包括一些示例),如果需要,请提出您自己的问题。 很遗憾我们不能像在Oracle 中那样使用AND/OR 运算符,更何况我们也不能通过参数将整个变量OLD 和NEW 传递给过程。我的代码将 > 2x 这对于在两次编写代码方面从不妥协的开发人员很有用.. @luismartingil 调用过程与内联过程可能会产生一些额外的开销。但作为交换,您可以更轻松地进行维护,并保证两个触发器的代码不会意外分歧。【参考方案2】:

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

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

【讨论】:

在这种情况下IN table_row_id VARCHAR(255) 是什么?我的意思是你如何定义要插入或更新哪一行?【参考方案3】:

很遗憾,我们不能在 MySQL 在 INSERT 或 UPDATE 描述之后使用,就像在 Oracle 中一样

【讨论】:

以上是关于用于插入和更新的 MySQL Fire Trigger的主要内容,如果未能解决你的问题,请参考以下文章

更高效地从 qtableWidget 更新和插入 MYSQL 数据库

MySQL - 带有更新和插入的过程中最后一次选择的输出

MySQL在插入数据时自动更新字段

SQL Server 2017 触发器将旧值作为更新后的新值

mysql笔记(10)-数据的插入和更新(insert/update/case)

MySQL 更新语句错误