MySQL 不允许在触发器中使用 CALL 语句,也就是不能调用存储过程 。
BEGIN 和 END
当触发器的触发条件满足时,将会执行 BEGIN 和 END 之间的触发器执行动作 。
注意:在 MySQL 中,分号 ; 是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了 。因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END 。NEW 和 OLD
这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思) 。它是一条命令,不需要语句结束标识,语法为:DELIMITER new_delemiter 。new_delemiter 可以设为 1 个或多个长度的符号,默认的是分号 ;,我们可以把它修改为其他符号,如 $ - DELIMITER $。在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了 $,才认为是语句结束 。注意,使用完之后,我们还应该记得把它给修改回来 。
- MySQL 中定义了 NEW 和 OLD 关键字,用来表示触发器的所在表中,触发了触发器的那一行数据 。
- 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
- 在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
- 在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
- 使用方法: NEW.columnName (columnName 为相应数据表某一列名)
提示:为了理解触发器的要点,有必要先了解一下创建触发器的指令 。CREATE TRIGGER 指令用于创建触发器 。
语法:
CREATE TRIGGER trigger_nametrigger_timetrigger_eventON table_nameFOR EACH ROWBEGINtrigger_statementsEND;说明:- trigger_name:触发器名
- trigger_time: 触发器的触发时机 。取值为 BEFORE 或 AFTER 。
- trigger_event: 触发器的监听事件 。取值为 INSERT、UPDATE 或 DELETE 。
- table_name: 触发器的监听目标 。指定在哪张表上建立触发器 。
- FOR EACH ROW: 行级监视,Mysql 固定写法,其他 DBMS 不同 。
- trigger_statements: 触发器执行动作 。是一条或多条 SQL 语句的列表,列表内的每条语句都必须用分号 ; 来结尾 。
DELIMITER $CREATE TRIGGER `trigger_insert_user`AFTER INSERT ON `user`FOR EACH ROWBEGININSERT INTO `user_history`(user_id, operate_type, operate_time)VALUES (NEW.id, 'add a user',now());END $DELIMITER ;查看触发器SHOW TRIGGERS;删除触发器DROP TRIGGER IF EXISTS trigger_insert_user;【程序员必备——SQL语法速成手册】
推荐阅读
- 上饶也有一处洞天福地——神农源景区
- 前端测试框架Jest——语法篇
- 分类算法其实也可做回归分析——以knn为例
- 什么是杜比全景声——沉浸式环绕声?
- 今日头条算法原理—— 3分钟了解今日头条推荐算法原理
- 开淘宝店必备的软件 手机淘宝开店软件哪个最好用
- 2020年最值得阅读的十本程序员书
- 医保卡——如何提现、如何使用?
- 网络程序员的一款“军刀”Postman
- 关于Java并发工具,90%的程序员需要了解的那些技术栈
