经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
MySQL触发器了解一下
来源:cnblogs  作者:布禾  时间:2021/4/19 8:52:07  对本文有异议

简介

触发器是与表有关的数据库对象,当表发生INSERT/UPDATE/DELETE操作时,对应操作的触发器会被触发,将在这些操作之前或之后执行触发器中定义的SQL语句集合。

触发器的使用

创建触发器

语法:

  1. CREATE
  2. [DEFINER = user]
  3. TRIGGER trigger_name
  4. trigger_time trigger_event
  5. ON tbl_name FOR EACH ROW
  6. [trigger_order]
  7. trigger_body

user:指定在触发器激活时检查访问权限时要使用的MySQL帐户。

trigger_name:触发器名称。

trigger_time:触发动作时间。可以是BEFORE或AFTER,表示触发器在要修改的每一行之前或之后激活。

trigger_event:触发器的类型,可以是INSERT、UPDATE、DELETE。

tbl_name:和触发器关联的表名,必须为一个永久表,不能是视图或者临时表。

trigger_order:指定触发器顺序,取值为FOLLOWS/PRECEDES+触发器名称。(从MySQL 5.7.2开始,可以为表创建具有相同trigger_time和trigger_event的多个触发器,默认顺序是按创建顺序进行激活)

trigger_body:触发器激活时要执行的语句。如果要执行多个语句,需要使用BEGIN ... END复合语句包裹。

示例:

  1. CREATE TRIGGER student_add2 AFTER INSERT ON tb_student
  2. FOR EACH ROW
  3. INSERT INTO tb_new_student (student_id, student_name) VALUES (NEW.id, NEW. NAME);

当在MySQL命令行创建执行多个语句的触发器时,同存储过程一样,也需要修改语句分隔符,如下:

  1. mysql> delimiter //
  2. mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
  3. FOR EACH ROW
  4. BEGIN
  5. IF NEW.amount < 0 THEN
  6. SET NEW.amount = 0;
  7. ELSEIF NEW.amount > 100 THEN
  8. SET NEW.amount = 100;
  9. END IF;
  10. END;//
  11. mysql> delimiter ;
触发器类型

触发器分为三种类型:INSERT、DELETE、UPDATE。

在触发器主体中,使用OLD和NEW关键字能够访问受触发器影响的行中的列,根据触发器类型的不同,在关键字使用上也有些区别。(OLD和NEW是对MySQL触发器的扩展,它们不区分大小写)

INSERT触发器:当在表中插入新行时,触发器就会激活。插入操作只有新行,所以只有NEW关键字可用,可以通过NEW访问插入的新行数据。

DELETE触发器:当在表中删除一行时,触发器就会激活。删除操作只有旧行,所以只有OLD关键字可用,可以通过OLD访问删除的旧行数据。

UPDATE触发器:当表中一行数据被修改时,触发器就会激活。NEW关键字和OLD关键字都可用,可以通过NEW访问更新后的行数据,通过OLD访问更新前的行数据。

查看触发器定义

语法:

  1. SHOW CREATE TRIGGER trigger_name

示例:

  1. mysql> SHOW CREATE TRIGGER student_add;
  2. +-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
  3. | Trigger | sql_mode | SQL Original Statement | character_set_client | collation_connection | Database Collation |
  4. +-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
  5. | student_add | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` TRIGGER student_add AFTER INSERT ON tb_student FOR EACH ROW INSERT INTO tb_new_student (student_id, student_name) VALUES (NEW.id, NEW. NAME) | utf8 | utf8_general_ci | utf8_general_ci |
  6. +-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+

Trigger:触发器名称。

sql_mode:当触发器执行时,SQL模式生效。

SQL Original Statement:触发器的创建语句。

character_set_client:创建触发器时character_set_client系统变量的会话值。

collation_connection:创建触发器时collation_connection系统变量的会话值。

Database Collation:与触发器相关联的数据库的排序。

删除触发器

语法:

  1. DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

示例:

  1. mysql> DROP TRIGGER student_add;
  2. Query OK, 0 rows affected

注意:如果表被删除,该表的关联的所有触发器也将会被删除

参考:Using Triggers

原文链接:http://www.cnblogs.com/seve/p/14644124.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号