触发器是与表有关的数据库对象,指在 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 \\