mysql中触发器

触发器

场景:

日志系统,记录对学生表有哪些操作!

解决的问题:

1, 得到每条学生记录被修改的时机,才能发出记录日志的动作!

2, 执行某段操作,需要得到当前处理的记录的信息!

触发器:一种编程设计!类似js的基于事件编程的程序设计的理念!可以在某个表的每条记录上,设置一个事件,从而对该表上的某些操作,加以监听!一旦所监听的行为出现,则会执行相应的代码。

记录 =button

(修改,删除,增加) =click

执行操作 =alert(‘Hello’);

以上的所有行为,都是采用 sql 完成的:

语法

create trigger 触发器名字 触发条件,监听的内容,触发后执行的操作

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt

其中,触发条件,事件。是由 事件的时机,与事件的内容 组成

时机:之前before,和之后after!

内容:增加insert,删除delete,修改update

因此,一共只有六种事件:

before insert before delete before update

after insert after delete after update

监听的主体是由表中的记录发出的

on table_name for each row

执行的操作,就是一段 sql的集合!

create trigger test_trigger
after insert -- 事件
on select_student for each row -- 哪个表的记录在监听
insert into student_log values (null, ‘insert‘, now(), ‘new ID‘) -- 执行的sql集合
;

  建立日志表

create table student_log (
id int primary key auto_increment,
op varchar(10),
op_time datetime,
ps varchar(255)
);

  

执行插入:

insert into select_student values (null, ‘欧阳锋‘, ‘male‘, 22, 1234.56, 178.00);

  

删除触发器

drop trigger 触发器名字

在触发程序中得到当前触发的记录信息

有,两个!

new(新的),old(旧的)

new,和old,都表示触发程序的记录!

new:新的记录。old:旧的记录!

取决于当前操作(intser,update,delete)去使用其中某个:

insert,增加记录,没有旧记录,只有new关键字可以使用

delete,删除记录,没有新纪录,只有old可用!

update,更新,既有新纪录,也有旧记录,更新前是旧记录,而更新后是新纪录!因此可以 new和 old

记录,当前学生被删除之后,记录日志,要求记录学生的id。

create trigger log_del_stu after delete
on select_student for each row
insert into student_log values (null, ‘delete‘, now(), old.id) -- 执行的sql集合
;

  

测试,删除记录:

create trigger log_upd_stu after update
on select_student for each row
判断学生的身高是否大于175
	记录日志
;

  

此时,留意一下 触发器,与具体的语法的执行时机:

当:insert into table操作!

判断,是否有before insert 触发器!有则执行触发程序!

真正执行 insert into

判断,是否有after insert 触发器!有则执行触发程序!

更新日志:

记录更新日志,要求是,只对某部分同学完成更新日志!

只记录,身高超过175学生的更新记录!记录学生id和修改前的身高与之后的身高

需要额外的增加条件判断!

逻辑分支语句:

if 条件 then

语句体

else if 条件 then

语句体

….

else

语句体

end if;

sql语句的结束符问题

可以修改 最外层的语句结束符达到目的!

delimiter $$

将语句结束修改成 $$

记住用完后要再修改回来!

delimiter $$
create trigger log_upd_stu after update
on select_student for each row
begin
if old.height > 175 then
	insert into student_log values (null, ‘update‘, now(), concat(old.id, ‘:‘, old.height, ‘---‘, new.height));
end if;
end
$$
delimiter ;

如果 触发程序由多条语句组成块。此时就需要使用

begin

end 将语句块包裹!

注意,关于触发器:

1, 一个表上的一个事件只能有一个触发器,如果需要,只能将原始的去掉,新增!

2, 只要事件发生,触发程序就可能执行!一条语句可能触发多个触发程序!

例如:

insert into on duplicate key update

before insert trigger, insert 操作失败 before update trigger, update操作, after update

before insert trigger, insert 操作成功 after insert trigger

mysql中触发器

时间: 2024-12-11 15:53:47

mysql中触发器的相关文章

Mysql中触发器的使用

概念 触发器是一种特殊的事务,它监听增删改操作,并触发增删改操作.主要是用来处理一些比较复杂的业务逻辑以保证数据的联动性.其包含了四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 语法 CREATE TRIGGER '触发器名称' '触发时间(after|before)' '监听的事情(insert|update|delete) ' ON '触发地点'

关于mysql中触发器old和new

1.当使用insert语句的时候,如果原表中没有数据的话,那么对于插入数据后表来说新插入的那条数据就是new,如图所示: 2.当使用delete语句的时候,删除的那一条数据相对于删除数据后表的数据来说就是od,如图所示: 3.当使用update语句的时候,当修改原表数据的时候相对于修改数据后表的数据来说原表中修改的那条数据就是old,而修改数据后表被修改的那条数据就是new,如图所示:

MySql中的存储过程和触发器的使用和区别

存储过程:是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象 优点:1允许模块化程序设计(创建一次多次使用)2允许更快执行3减少网络流量4更好的安全机制 格式: DELIMITER // CREATE PROCEDURE 储存名([ IN ,OUT ,INOUT ]?参数名?数据类形...) BEGIN SQL语句 END //

MYSQL中SHOW的使用整理收藏

好记性不如乱笔头吧....下面收藏整理了mysql中show 的使用技巧....有需要的博友可以看看哈 a. show tables或show tables from database_name; // 显示当前数据库中所有表的名称 b. show databases; // 显示mysql中所有数据库的名称 c. show columns from table_name from database_name; 或show columns from database_name.table_nam

MYSQL中show命令合集

a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称 b. show databases; -- 显示mysql中所有数据库的名称 c. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称 d. show grants for user_name; -- 显示一个用

mysql中的索引、触发器、和事务

一.索引 1.什么是索引 如果把表看做一本书,索引就好像书里的目录或者书签,能帮助你快速找到你要检索的内容,所以叫做索引. 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如 果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合 要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已 经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个 记录,通过索引查找记录至少要比

mysql中的触发器和事务的操作

触发器 语法 创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt; trigger_time是触发程序的动作时间.它可以是BEFORE或AFTER trigger_event指明了激活触发程序的语句的类型. trigger_event可以是下述值之一: ·             INSERT:将新行插入表时激活触发程序,例如,通过INSERT.LO

mysql中索引,触发器,事务,存储引擎的理解

1.索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询. 索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象.其实索引相当于一本书的目录,如果没有索引,要想在数据库中查找某一特定的值就需要遍历整个数据库表,但是有了索引之后就可以在索引当中查找,有助于更快地获取信息: 索引可分为聚集索引和非聚集索引: 聚集索引:是按照数据存放的物理位置为顺序的: 非聚集索引中,表数据存储顺序与索引顺序无关:一张表上只能创建一个聚集索引,因为真实数据的物

Oracle使用触发器和mysql中使用触发器的比较——学习笔记

一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志,自动通知好友,其实就是在增加日志的时候做一个出发,再向表中写入条目. --触发器的效率很高 举例:论坛的发帖,每插入一个帖子都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,这时使用触发器效率会很高. 二.Oracle 使用 PL/SQL 编写触发器 1.--PL/SQL创建触发器的一般语法