Msql触发器

Msql触发器,trigger

场景:

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

解决的问题:

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

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

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

JS事件:

<button onclick="alert(‘Hello‘);" /> click me </br >

记录                                = 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‘)
;

建立日志表:

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,2345.36,178.00);

日志表内的记录自动增加:

可见 insert into student_log触发程序,执行成功!

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

有两个:new , old

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

new : 新的记录

old : 旧的记录

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

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

delete , 删除记录,没有新记录,只有old关键字可以使用

update , 更新,既有新纪录,也有旧记录,更新前是旧记录,而更新后是新记录

记录:当学生被删除之后,记录日志,要求记录学生的ID

创建删除日志表:

create trigger log_del_stu after delete 
on select_student for each row
insert into student_log values (null,‘delete‘,now(),old.id)
;

测试:删除记录:

delete from select_student where id=46;

查看日志文件:

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

如:insert into table操作

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

真正执行 insert into

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


更新日志:

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

只记录身高超过175学生的更新记录!需要记录修改前后的身高信息

需要额外的增加条件判断

create trigger log_upd_stu after update

on select_student for each row

if old.height > 175 then

insert into student_log values (null,‘update‘,now(),concat(old.id,‘:‘,old.height,‘--‘,new.height));

end if;
;

逻辑分支语句:

if 条件 then

语句体

else if 条件 then

语句体

......

else

语句体

end if;

sql语句结束符问题:

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

delimiter $$

将语句结束符修改成:$$

记住用完之后要修改成分号为结束符

因此,上面的语句需要修改成为:

delimiter $$

create trigger log_upd_stu after update 

on select_student for each row

if old.height > 175 then

	insert into student_log values (null,‘update‘,now(),concat(old.id,‘:‘,old.height,‘--‘,new.height));

end if;

$$

delimiter ;

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

因此,上面的创建触发器语句的完整写法为:

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 ;

测试:

注意:关于触发器

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

删除触发器:drop trigger 触发器名称;

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

例如:

insert into on duplicate key update;

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

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

时间: 2024-10-24 16:07:32

Msql触发器的相关文章

msql,触发器无事物回滚,插入之前满足条件再插入

很少写mysql的触发器和存储过程,由于需要需要做一个很小的判断,要用到触发器,要达到的效果就是,插入之前判断是否满足条件如果不满足就不插入 如果用sqlserver 或者orcale 就很简单,按sqlserver 和orcale的思路去找事物回滚,或者抛异常,都没用,最后只有不断查资料不断尝试,只有用mysql的触发器机制,触发器中无法修改,删除原表的值,也无法有返回值 最后代码如下 CREATETRIGGER `duanxin_before_insert` BEFORE INSERT ON

msql数据库触发器和连接mysql常用函数

触发器delimiter $$(设置$$为语句结束符)例:delimiter $$create trigger jiaobanfei after update on user1     for each row beginupdate user2 set age=age+(old.num-new.num);update user2 set num=num+1;end$$delimiter; old.age-new.age 删除;drop trigger jiaobanfei; update us

Msql入门实战之下

前面一章主要解说了mysql的select的使用方法.将select的大部分使用方法进行分别解说.本章主要解说Msql约束表的建立,以及存储过程的实现,附带其它介绍.临时就算入门了,Mysql索引之后另开章节. 解说不到位的地方欢迎大家指正:联系方式rlovep.com 全部代码下载(csdn):链接 Github链接:链接https://github.com/wpeace1212/Mysql 写文章不易,欢迎大家採我的文章.以及给出实用的评论,当然大家也能够关注一下我的github.多谢: 1

Day4 MySql触发器视图索引以及设计优化

触发器 MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 通过事件触发,不能传参 语法 CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body trigger_t

Msql浅析-基础命令(二)

篇幅简介 一.Msql数据类型 1.整型 tinyint,  占 1字节 ,有符号: -128~127,无符号位 :0~255 smallint, 占 2字节 ,有符号: -32768~32767无符号位 :0~65535 mediumint 占 3字节 ,有符号: -8388608~8388607,无符号位:0~16777215: int, 占 4字节 ,有符号: -2147483648~2147483647,,无符号位 无符号位 :0~4 284967295 bigint, bigint,b

Oracle数据库——触发器的创建与应用

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

Mysql中的触发器

阅读目录 什么是触发器 特点及作用 例子:创建触发器,记录表的增.删.改操作记录 弊端 什么是触发器 简单的说,就是一张表发生了某件事(插入.删除.更新操作),然后自动触发了预先编写好的若干条SQL语句的执行: 特点及作用 特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行: 作用:保证数据的完整性,起到约束的作用: 例子:创建触发器,记录表的增.删.改操作记录 接下来将创建user和user_history表,以及三个触发器tri_insert_u

oracle(sql)基础篇系列(五)&mdash;&mdash;PLSQL、游标、存储过程、触发器

  PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是为了补充SQL语言的,是带有了分支和循环的语言. PL/SQL 语法 基本数据类型声明 declare v_name varchar2(20); v_temp number(1); v_count binary_integer := 0; v_sal number(7,2) := 4000.00

information_schema系列五(表,触发器,视图,存储过程和函数)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:TABLES TABLES这张表毫无疑问了,就是记录的数据库中表的信息,其中包括系统数据库和用户创建的数据库.而TABLESPACES 却是标注的活跃表空间. 看一下TABLES 的记录关于TEST1表: 其实我们通过show table status like 'test1'\G;可以看到相同的信息. TABLE_TYPE这列有两种类型,分别是BASE TAB