1.概念
- 触发器就是在表数据发生变化的时候,自动触发的一些 SQL 操作,查询不影响表中的数据,所以没有触发器。
- 类似于web监听器机制,监听对应表的增删改。
2.触发器分类
触发器类型 | OLD 触发器之前的效果 | NEW 触发器之后的效果 |
---|---|---|
INSERT 类型的触发器 | 无(因为插入前,没有之前的数据) | NEW 表示将要或者已经新增的数据 |
UPDATE 类型的触发器 | OLD 表示修改之前的数据 | NEW 表示将要或者已经修改后的数据 |
DELETE 类型的触发器 | OLD 表示将要或者已经修改的数据 | 无(因为删除后,状态无数据) |
3.触发器创立语法
DELIMITER $ --定义临时语句结束符号
CREATE TRIGGER 触发器的名称
-- BEFORE|AFTER表示在操作之前还是操作之后执行日志记录
BEFORE|AFTER INSERT|UPDATE|DELETE ON 需要监测的表名称 FOR EACH ROW
BEGIN
触发器要执行的功能;
END$
DELIMITER ;
4.各种类型的触发器应用举例
账户表account
日日志表account_log
<1>INSERT 触发器
创建INSERT型触发器。用于对account表新增数据进行日志的记录
DELIMITER $
CREATE TRIGGER account_insert
AFTER INSERT ON account FOR EACH ROW
BEGIN
INSERT INTO account_log VALUES(NULL,'INSERT',NOW(),new.id,CONCAT('插入后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
END$
DELIMITER ;
-- 向account表添加一条记录
INSERT INTO account VALUES(NULL,'张益达',2000);
-- 查询account_log表
SELECT * FROM account_log;
account_log查询结果:
<2>UPDATE 触发器
创建UPDATE型触发器。用于对account表修改数据进行日志的记录
DELIMITER $
CREATE TRIGGER account_update
AFTER UPDATE ON account FOR EACH ROW
BEGIN
INSERT INTO account_log VALUES(NULL,'UPDATE',NOW(),new.id,
CONCAT('更新前{id=',old.id,',name=',old.name,',money=',old.money,'}','更新后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
END$
DELIMITER ;
-- 修改account表中李四的金额为2000
UPDATE account SET money=2000 WHERE id IN(1,2);
-- 查询account表
SELECT * FROM account;
-- 查询account_log表
SELECT * FROM account_log;
account_log查询结果:
<3>DELETE 触发器
创建DELETE型触发器。用于对account表删除数据进行日志的记录
DELIMITER $
CREATE TRIGGER account_delete
BEFORE DELETE ON account FOR EACH ROW -- 使用before和after都可以
BEGIN
INSERT INTO account_log VALUES(NULL,'DELETE',NOW(),old.id,CONCAT('删除前{id=',old.id,',name=',old.name,',money=',old.money,'}'));
END$
DELIMITER ;
-- 删除account表中id=3的记录
DELETE FROM account WHERE id=3;
-- 查询account表
SELECT * FROM account;
-- 查询account_log表
SELECT * FROM account_log;
account_log查询结果:
5.查看/删除本数据库中触发器
- 1.查看触发器
SHOW TRIGGERS;
- 2.删除触发器
DROP TRIGGER 触发器的名称;