什么是触发器?
触发器是与表相关的数据库对象,当满足定义的条件时触发并执行触发器中定义的语句集。 触发器的这一特性可以帮助应用程序确保数据库端的数据完整性。
比如你现在有两张表【用户表】和【日志表】,当创建用户时,需要将创建的日志插入到日志表中。 如果不使用触发器,则需要编写编程语言逻辑来实现,但是如果定义了触发器,触发器的作用就是在向日志表中插入一条数据后,帮助你向日志表中插入一条日志消息。用户表。 当然,触发器不仅可以执行插入操作,还可以执行修改和删除操作。
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:触发器的名称
tirgger_time:触发时机,为BEFORE或者AFTER
trigger_event:触发事件,为INSERT、DELETE或者UPDATE
tb_name:表示建立触发器的表明,就是在哪张表上建立触发器
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
触发特性:
1、begin end和begin end之间的语句; 可以简单地写,也可以复杂地写。
2.什么条件会触发:I、D、U
3.何时触发:添加、删除、修改之前或之后
4、触发频率:每行执行一次
5. 触发器在表上定义并附加到表上。
即,由事件触发操作。 事件包括陈述、陈述和陈述; 它们可以帮助应用程序确保数据库端数据的完整性。
AFTER 参数指定在事件之前或之后触发执行的时间。
> FOR EACH ROW 表示对一条满足触发事件的记录进行任何操作都会触发触发,即触发频率为每行数据触发一次。
> 详细说明:
类型①触发器:当插入某行时激活触发器,可能由LOAD DATA语句触发(LOAD DAT语句用于将文件加载到数据表中,相当于一系列操作);
②触发器类型:触发器在某一行发生改变时被激活,可能由一条语句触发;
③类型触发器:触发器在删除某一行时激活,可由语句触发。
尽可能少地使用触发器,不建议使用它们。
假设触发器每次执行1s,表有500条数据,那么触发器需要触发500次。 仅触发器执行时间就需要500s,500条数据总共时间为1s,这样的效率很低。 。 因此,我们需要特别关注的是触发器的begin end之间的语句的执行效率; 一定要高,资源消耗一定要小。
尽量少用触发器,因为无论如何,它仍然会消耗资源。 如果使用,请谨慎使用并确保它非常高效:触发器针对每一行; 记住不要添加、删除或修改非常频繁的表。 使用触发器,因为它们非常消耗资源。
创建触发器 触发器名称|AFTER 触发器事件
ON 表名 FOR EACH ROW
开始
执行语句列表
END;案例操作创建学生表
CREATE TABLE `student` (
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`age` int DEFAULT NULL,
`sex` varchar(255) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
手动添加两行数据:
创建一个触发器,名称为:
CREATE TRIGGER check_student BEFORE UPDATE ON student
FOR EACH ROW
BEGIN
IF NEW.age < 0 THEN
SET NEW.age = 0;
ELSEIF NEW.age > 100 THEN
SET NEW.age = 50;
END IF;
END
NEW 和 OLD 的详细解释
MySQL中定义了NEW和OLD来表示触发器所在表中触发触发器的数据行,引用触发器中发生变化的记录内容。 具体来说:
①在类型触发器中,NEW用于表示将要插入()或已经插入(AFTER)的新数据;
②在类型触发器中,用OLD表示将要或已修改的原始数据,用NEW表示将要或已修改的新数据;
③类型触发器中,OLD用于表示将要或已经被删除的原始数据;
指示:
新的。 (是对应数据表的列名)
另外,OLD是只读的,而NEW可以在触发器中使用SET赋值,这样就不会再次触发触发器,造成循环调用。
触发执行
UPDATE student set age =-10 where name ='张三'
查看触发器
1.SHOW语句查看触发器信息
mysql> SHOW TRIGGERS;
结果,显示所有触发器的基本信息。
2.查看表中的触发器信息
mysql> * 来自 .;
显示所有触发器的详细信息; 同时该方法可以查询指定触发器的详细信息。
mysql> select * from information_schema.triggers
-> where trigger_name='check_student';
所有触发器信息都存储在数据库下的表中,可以使用语句查询。 如果触发信息过多,最好通过字段指定查询。
删除触发器 DROP [IF ] [.]
删除触发器后,最好再用上面的方法检查一下; 同时,还可以使用.trig来指定数据库中的触发器。
尖端:
如果不需要触发器,则必须将其删除,以避免意外操作。 这很关键。