首页 > 解决方案 > 如何识别 MySQL 触发器操作

问题描述

在 Oracle 中,当编写一个处理 INSERT、UPDATE 或 DELETE 操作的唯一触发器时,何时可以使用这种技术检测正在执行的操作,称为“条件谓词

create trigger sample_trigger
    before insert or update
    on sample_table
    for each row
begin
    case
        when inserting then
            --do something
        when updating then
            --do something
    end case;
end;

MySQL 5.6 是否提供任何允许我这样做的技术?我不想编写三个不同的触发器来区分正在执行的操作。谢谢!

标签: mysqltriggers

解决方案


不可以。在 MySQL 中(甚至在 8.0 中)只能为一种类型的操作调用触发器INSERTUPDATEDELETE。从手册中,语法为CREATE TRIGGER

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name
    trigger_time trigger_event
    ...

并且trigger_event只能是INSERT,UPDATE或之一DELETE:

trigger_event: { INSERT | UPDATE | DELETE }

因此,鉴于没有为不同操作调用触发器的范围,因此不需要您描述的条件谓词。

您可以做的是将您的触发器代码放入存储过程中,然后使用指定操作类型的参数调用它,例如INSERT您可能使用的触发器

CREATE TRIGGER db_insert
BEFORE INSERT ON db
FOR EACH ROW
BEGIN
    CALL db_trigger_proc('INSERT');
END

推荐阅读