1、概述
触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集。
可以使用触发器的别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发(oracle可以支持句级触发器)。
触发器类型 NEW 和 OLD的使用:
INSERT 型触发器 :NEW 表示将要或者已经新增的数据。
UPDATE 型触发器 :OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据。
DELETE 型触发器 :OLD 表示将要或者已经删除的数据。
2、创建触发器
create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ] – 行级触发器
begin
trigger_stmt ;
end;
3、删除触发器
drop trigger [schema_name.]trigger_name;
如果没有指定 schema_name,默认为当前数据库 。
4、查看触发器
show triggers ;
5、案例
需求:通过触发器记录 emp 表的数据变更日志 , 包含增加, 修改 , 删除 ;
创建数据表emp:
CREATE TABLE emp (
id INT (11) NOT NULL auto_increment,
NAME VARCHAR (50) NOT NULL COMMENT '姓名',
age INT (11) COMMENT '年龄',
salary INT (11) COMMENT '薪水',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT charset = utf8;
创建日志表emp_log:
CREATE TABLE emp_logs (
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 emp_logs_insert_trigger AFTER INSERT ON emp FOR EACH ROW
BEGIN
INSERT INTO emp_logs (
id,
operation,
operate_time,
operate_id,
operate_params
)
VALUES
(
NULL,
'insert',
now(),
new.id,
concat(
'插入后(id:',
new.id,
', name:',
new. NAME,
', age:',
new.age,
', salary:',
new.salary,
')'
)
);
END;
创建update触发器
CREATE TRIGGER emp_logs_update_trigger AFTER UPDATE ON emp FOR EACH ROW
BEGIN
INSERT INTO emp_logs (
id,
operation,
operate_time,
operate_id,
operate_params
)
VALUES
(
NULL,
'update',
now(),
new.id,
concat(
'修改前(id:',
old.id,
', name:',
old. NAME,
', age:',
old.age,
', salary:',
old.salary,
') , 修改后(id',
new.id,
'name:',
new. NAME,
', age:',
new.age,
', salary:',
new.salary,
')'
)
);
END;
创建delete触发器
CREATE TRIGGER emp_logs_delete_trigger AFTER DELETE ON emp FOR EACH ROW
BEGIN
INSERT INTO emp_logs (
id,
operation,
operate_time,
operate_id,
operate_params
)
VALUES
(
NULL,
'delete',
now(),
old.id,
concat(
'删除前(id:',
old.id,
', name:',
old. NAME,
', age:',
old.age,
', salary:',
old.salary,
')'
)
);
END;
测试
insert into emp(id,name,age,salary) values(null, 'lzq',30,350000);
update emp set age = 39 where id = 3;
delete from emp where id = 7;