触发器是与表有关的数据库对象,指在 insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名OLD和NEW来引用触发器中变化的记录内容,这与其它的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发,

触发器类型

NEW和OLD

INSERT型触发器

NEW表示将要或者已经新增的数据

UPDATE型触发器

OLD表示修改之前的数据,NEW表示将要或已经修改后的数据

DELETE型触发器

OLD表示将要或者已经删除的数据

语法

  • 创建
CREATE TRIGGER trigger_name
BEFORE/ALTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW --行级触发器
BEGIN
	trigger_stmt;
END;
  • 查看
SHOW TRIGGERS;
  • 删除
DROP TRIGGER [schma_name.]trigger_name;--如果没有指定schema_name,默认为当前数据库。

案例:通过触发器记录 student 表的数据变更日志,将变更日志插入到日志表stu_log中,包含增加,修改,删除;
创建日志表:

create table stu_log(
    id int(11) not null auto_increment,
    operation varchar(20) not null comment '操作类型,insert/update/delete',
    operate_time datetime not null comment '操作时间',
    operate_id int(11) not null comment '操作id',
    operate_params varchar(500) comment '操作参数',
    primary key(id)
)engine=innodb default charset=utf8;

创建insert触发器

create trigger stu_insert_trigger
    after insert on student for each row
begin
    insert into stu_log(id, operation, operate_time, operate_id, operate_params) VALUES
    (null,'inssert',now(),new.id,concat('插入的数据内容为id=',new.id,',name=',new.name,',age=',new.age,',phone=',new.phone));
end \\

创建update触发器

create trigger stu_log_update
    after update on student for each row
begin
    insert into stu_log value
        (null,'update',now(),new.id,
         concat('修改前的数据内容为id=',old.id,',name=',old.name,',age=',old.age,',phone=',old.phone,
         ' | 修改后的数据内容为id=',new.id,',name=',new.name,',age=',new.age,',phone=',new.phone));
end \\

创建delete触发器

create trigger stu_delete_trigger
    after delete on student for each row
begin
    insert into stu_log value (null,'dalete',now(),old.id,concat('删除的内容id=',old.id,',name=',old.name,',age=',old.age,',phone=',old.phone));
end \\