一、什么是触发器:
触发器是与表有关的数据库对象,当触发器所在表上出现指定事件并满足定义条件的时候,将执行触发器中定义的语句集合。
触发器的这种特性可以协助应用在数据库端确保数据的完整性。触发器是一个特殊的存储过程,不同的是存储过程要用call来调用,而触发器不需要使用call,也不需要手工调用
,它在插入,删除或修改特定表中的数据时触发执行,
它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
二、创建触发器:
1、语法:
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。
由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。
2、Trigger_event 详解:
MySQL 除了对 INSERT、UPDATE、DELETE 基本操作进行定义外,还定义了 LOAD DATA 和 REPLACE 语句,这两种语句也能引起上述6中类型的触发器的触发。
(1)LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT 操作。
(2)REPLACE 语句一般来说和 INSERT 语句很像,只是在表中有 primary key 或 unique 索引时,如果插入的数据和原来 primary key 或 unique 索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条 REPLACE 语句有时候等价于一条。
(3)UPDATE 语句,有时候等价于一条 DELETE 语句加上一条 INSERT 语句。
INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。
3、BEGIN … END
详解:
在MySQL中,BEGIN … END 语句的语法为:
BEGIN
[statement_list]
END
其中,statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾。
而在MySQL中,分号是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL可以开始执行了。因此,解释器遇到statement_list 中的分号后就开始执行,然后会报出错误,因为没有找到和 BEGIN 匹配的 END。
这时就会用到 DELIMITER 命令,它是一条命令,不需要语句结束标识,语法为:
DELIMITER new_delemiter
new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;),我们可以把它修改为其他符号,如$:
DELIMITER $
在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了$,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。
4、触发器示例:
假设系统中有两个表:
班级表 class(班级号 classID, 班内学生数 stuCount)
学生表 student(学号 stuID, 所属班级号 classID)
要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:
DELIMITER $
create trigger tri_stuInsert after insert
on student for each row
begin
declare c int;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;
5、NEW 与 OLD 详解:
(1)在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
(2)在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
(3)在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。
三、触发器其他操作:
1、查看触发器信息:
查看触发器是指数据库中已存在的触发器的定义、状态、语法信息等。
SHOW TRIGGERS [FROM schema_name]; --第一种
其中,schema_name 可以指定数据库名。
在TRIGGERS 表中查看触发器信息:
SELECT * FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_NAME`='xxxx'; --第二种
2、删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;
四、触发器相关:
1、触发器的执行顺序与异常机制:
MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作。如果是对事务表进行的操作,那么会整个作为一个事务被回滚,但是如果是对非事务表进行的操作,那么已经更新的记录将无法回滚。
(1)如果 BEFORE 触发器执行失败,SQL 无法正确执行;
(2)SQL 执行失败时,AFTER 型触发器不会触发;
(3)AFTER 类型的触发器执行失败,SQL 会回滚。
2、触发器的使用限制:
(1)触发器只能创建在永久表上,不能对临时表创建触发器;
(2)触发程序不能调用将数据返回给客户端的存储程序,也不能使用CALL语句的动态SQL语句,但是允许存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
(3)触发器中不能使用开启或结束事务的语句段,比如,开始事务(START TRANSACTION)、提交事务(COMMIT)或是回滚事务(ROLLBACK),但是回滚到一个保存点(SAVEPOINT是允许的,因为回滚到保存点不会结束事务);
(4)外键不会激活触发器;
(5)当使用基于行的复制时,从表上的触发器不会因操作主表中的数据而激活。当使用基于语句的复制时,从表上的触发器会被激活。
(6)触发器中不允许返回值,因此触发器中不能有返回语句,如果要立即停止一个触发器,应该使用LEAVE语句;
3、触发器的作用:
(1)安全性。可以基于数据库的值使用户具有操作数据库的某种权利。
--可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
--可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。
(2)审计。可以跟踪用户对数据库的操作。
--审计用户操作数据库的语句。
--把用户对数据库的更新写入审计表。
(3)实现复杂的数据完整性规则:
--实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。
--提供可变的缺省值。
(4)实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。
--修改或删除时级联修改或删除其它表中的与之匹配的行。
--在修改或删除时把其它表中的与之匹配的行设成NULL值。
--在修改或删除时把其它表中的与之匹配的行级联设成缺省值。
--触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。例如,可以在books.author_code 列上生成一个插入触发器,如果新值与auths.author_code列中的某值不匹配时,插入被回退。
(5)同步实时地复制表中的数据。
(6)自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。
相关博客:
https://www.cnblogs.com/duodushu/p/5446384.html
一、什么是触发器:触发器是与表有关的数据库对象,当触发器所在表上出现指定事件并满足定义条件的时候,将执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。触发器是一个特殊的存储过程,不同的是存储过程要用call来调用,而触发器不需要使用call,也不需要手工调用,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制...
今天继续给大家介绍
MySQL
相关知识,本文主要内容是
MySQL
触发器
相关知识。
一、
触发器
简介
触发器
是一种特殊的存储过程,在定义
触发器
时会定义
触发器
的触发条件,使得
触发器
在满足触发条件时自动执行而不需要认为调用。尽管
触发器
的原理很简单,但是在
MySQL
中引入并使用
触发器
,可以实现很多实用的效果,并满足一些特定业务环境的需要。
二、
触发器
定义
三、
触发器
示例
四、
触发器
查看与删除
触发器
是与表有关的
数据库
对象,在满足定义条件时触发,并执行
触发器
中定义的语句集合。
触发器
的这种特性可以协助应用在
数据库
端确保数据的完整性。
举个例子,比如你现在有两个表【用户表】和【日志表】,当一个用户被创建的时候,就需要在日志表中插入创建的log日志,如果在不使用
触发器
的情况下,你需要编写程序语言逻辑才能实现,但是如果你定义了一个
触发器
,
触发器
的作用就是当你在用户表中插入一条数据的之后帮你在日志表中插入一条日志信息。当然
触发器
并不是只能进行插入操作,还能执行修改,删除。
二、
触发器
mysql
导入数据提示没有SUPER Privilege权限处理,如下所示:
ERROR 1419 (HY000): You do not have the SUPER Privilege and Binary Logging is Enabled
导入function 、
trigger
到
MySQL
database,报错:
You do not have the SUPER privilege and binary logging is enabled (you *might* want t
1. 打开
MySQL
Workbench并连接到您的
数据库
。
2. 在左侧面板中,选择您要创建
触发器
的
数据库
。
3. 在顶部菜单中,选择“Database”>“Create
Trigger
”。
4. 在弹出窗口中,输入
触发器
的名称和描述。
5. 选择
触发器
要应用的表和
触发器
类型(例如,BEFORE INSERT,AFTER UPDATE等)。
6. 编写
触发器
的SQL语句,并在“
Trigger
Body”字段中输入。
7. 单击“Apply”以保存
触发器
。
请注意,创建
触发器
需要一定的SQL知识和对
数据库
结构的理解。如果您不确定如何编写
触发器
,请咨询专业人士或参考
MySQL
官方文档。