MySQL 触发器
触发器
一、介绍
触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别 名OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。
触发器类型 | NEW 和 OLD |
---|---|
INSERT型触发器 | NEW 表示将要或者已经新增的数据类型 |
UPDATE型触发器 | OLD 表示修改之前的数据,NEW 表示将要修改或者已经修改后的数据 |
DELETE型触发器 | OLD 表示将要或者已经删除的数据 |
二、语法
-
创建
CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON tbl_name FOR EACH ROW -- 行级触发器 BEGIN trigger_stmt; END; -
查看
SHOW TRIGGERS; -
删除
DROP TRIGGER [schema_name.]trigger_name; -- 如果没有指定schema_name,默认为当前数据库。
代码演示:
-- 触发器 -- 准备工作:日志表 user_logs CREATE TABLE user_logs( id INT(11) NOT NULL auto_increment, operation VARCHAR(20) NOT NULL COMMENT '操作类型,insert/update/delete', operate_time datetime NOT NULL COMMENT '操作时间', operate_empno INT(11) NOT NULL COMMENT '操作的empno', operate_params VARCHAR(1000) COMMENT '操作参数', PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入数据触发器(insert) CREATE TRIGGER emp_insert_trigger AFTER INSERT ON emp FOR EACH ROW BEGIN INSERT INTO user_logs VALUES(null, 'insert', NOW(), new.empno, CONCAT('输入的内容:',new.empno,new.ename, new.job, new.mgr,new.hiredate,new.sal,new.comm,new.deptno)); END; -- 查看 SHOW TRIGGERS; -- 删除 DROP TRIGGER emp_insert_trigger; INSERT INTO emp VALUES(7800, 'TIM', 'SALESMAN',7902, '1980-12-15 00:00:00', 900, 1000, 20); SELECT * FROM user_logs; -- 修改数据触发器(update) CREATE TRIGGER emp_update_trigger AFTER UPDATE ON emp FOR EACH ROW BEGIN INSERT INTO user_logs VALUES(null, 'update', NOW(), new.empno, CONCAT('更新之前的数据:','empno=',old.empno,'ename=',old.ename,'job=', old.job, 'mgr=',old.mgr,'hiredate=',old.hiredate,'sal=',old.sal,'comm=',old.comm,'deptno=',old.deptno, '| 更新之后的数据:','empno=',new.empno,'ename=',new.ename,'job=', new.job, 'mgr=',new.mgr,'hiredate=',new.hiredate,'sal=',new.sal,'comm=',new.comm,'deptno=',new.deptno)); END; SHOW TRIGGERS; UPDATE emp SET sal = 1900 WHERE empno = 7800; UPDATE emp SET sal = 1900 WHERE empno < 7800; -- empno < 7800 的记录有几条,就执行几次触发器 SELECT * FROM user_logs; -- 删除数据的触发器(delete) CREATE TRIGGER emp_delete_trigger AFTER DELETE ON emp FOR EACH ROW BEGIN INSERT INTO user_logs VALUES(null, 'delete', NOW(), old.empno, CONCAT('删除之前的数据:','empno=',old.empno,'ename=',old.ename,'job=', old.job, 'mgr=',old.mgr,'hiredate=',old.hiredate,'sal=',old.sal,'comm=',old.comm,'deptno=',old.deptno)); END; SHOW TRIGGERS; DELETE FROM emp WHERE empno = 7800; SELECT * FROM user_logs;
本文作者:凉白茶
本文链接:https://www.cnblogs.com/zh-Note/p/17454984.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步