2009-08-23 55 views
78

是否可以针对表的插入和更新事件触发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 
..... 

是否有可能呢,还是必须使用2个触发器?这两个代码是相同的,我不想重复。

回答

94

你必须创建两个触发器,但是您可以将普通代码的程序,让他们都调用的程序。

+1

这是一个好主意。还没有想过使用一个程序。 – 2009-08-25 10:06:39

+1

你能给我们这些对语法不熟悉的人给一个玩具的例子吗? – Zxaos 2011-07-01 00:00:52

+2

@Zxaos:我建议从http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html(其中包含一些示例)开始并根据需要询问您自己的问题。 – derobert 2011-07-01 05:21:01

8

不幸的是,我们不能在MySQL 使用INSERT后或更新描述,就像在甲骨文

38

针对@Zxaos要求,因为我们不能拥有和/或运营商MySQL的触发器,从您的代码,下面是实现相同的完整示例。

1.定义INSERT触发器:

DELIMITER // 
DROP TRIGGER IF EXISTS my_insert_trigger// 
CREATE [email protected] 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 [email protected] 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 [email protected] 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 ; 

您注意到我在处理定义触发器和过程的业务时需要注意恢复定界符。

+1

在这种情况下,IN table_row_id VARCHAR(255)是什么?我的意思是你如何定义哪一行将被插入或更新? – VaTo 2016-02-25 01:04:01