兄弟连_马剑威_JavaWeb_015_MySQL触发器
MySQL中的触发器和事件的使用方法

MySQL中的触发器和事件的使用方法MySQL数据库是目前最为常用的关系型数据库管理系统之一,它具备强大的功能和灵活的应用性。
在开发和管理数据库时,我们常常会遇到需要在特定条件下执行一些操作的情况,这就需要用到MySQL的触发器和事件。
本文将重点介绍MySQL中的触发器和事件的使用方法,包括其定义、语法、应用场景以及注意事项等方面,旨在帮助读者更好地理解和掌握这两个重要的功能。
一、触发器的定义和语法触发器是MySQL中的一种特殊的存储过程,它是在指定的数据表上进行操作(插入、更新或删除)时自动触发执行的一段程序。
触发器的定义语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_nameFOR EACH ROWtrigger_body其中,trigger_name是触发器的名称,table_name是触发器所关联的数据表的名称,{BEFORE | AFTER}表示触发器在操作之前还是之后执行,{INSERT | UPDATE | DELETE}表示触发器在插入、更新或删除操作时执行,FOR EACH ROW表示触发器针对每一行记录执行,trigger_body是触发器的主体部分,可以包含SQL语句或调用存储过程等。
例如,下面是一个简单的触发器示例,它在每次向表中插入新记录时自动将记录的创建时间设置为当前时间:CREATE TRIGGER set_create_timeBEFORE INSERT ON usersFOR EACH ROWSET NEW.create_time = NOW();以上示例中,set_create_time是触发器的名称,users是触发器所关联的数据表的名称,BEFORE INSERT表示触发器在插入操作之前执行,FOR EACH ROW表示触发器针对每一行记录执行,SET NEW.create_time = NOW()是触发器的主体部分,它将NEW关键字指代的新插入的记录的create_time字段设置为当前时间。
mysql_触发器、函数、if的使用

mysql_触发器、函数、if的使⽤触发器在当前的表上,设置⼀个对每⾏数据的⼀个监听器,监听相关事件,每当事件触发时,就会执⾏⼀段由sql完成的⼀段功能代码触发事件:insert, delete, updatenew old : 针对的是触发的那张表 on 表名insert :没有 old 有new 【对于插⼊,插⼊之前什么都没有,插⼊之后才有数据】update : 有old 有newdelete : 有old 没有new因为数据的改变不是固定,所以需要获取触发程序时的数据old: 表⽰事件发⽣之前的数据, 旧的数据new: 表⽰事件发⽣之后的数据, 新的数据事件的时机: after(表⽰执⾏之后), before(表⽰执⾏之前);事件和时机组合在⼀起⼀共有六种事件before insert, before delete, before updateafter insert, after delete, after update监听的地点: table(表),事件规定在哪个表上的哪个时机的什么动作上**************************************************************************************************创建触发器语法格式create trigger trigger_name [六种情况] on table_namefor each rowbeginsql statement;end;删除触发器drop trigger trigger_name;查看触发器select trigger_name from `information_schema`.TRIGGERS;***************************************************************************************************drop table if exists seller;create table seller(name varchar(30),money double(8,2));insert into seller values('狗娃', 5000);drop table if exists buyer;create table buyer(name varchar(30),money double(8,2));insert into buyer values('狗蛋', 1000);例: 创建触发器drop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer after update on buyerfor each rowbeginupdate seller set money = money + 10;end$$delimiter ;update buyer set money = money - 10;例: 查看触发器select trigger_name from `information_schema`.TRIGGERS;例: 删除触发器drop trigger [if exists] tr_buyer;**************************************************************************************************例: 创建触发器drop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer after update on buyerfor each rowbegin# update seller set money = money + (买家原有的钱 - 买家现在的钱) '买家买东西的钱'; update seller set money = money + (old.money - new.money);end$$delimiter ;update buyer set money = money - 1000;例: drop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer before update on buyerfor each rowbeginif new.money >= 0 thenupdate seller set money = money + (old.money - new.money);elseSIGNAL SQLSTATE 'HY000' set MESSAGE_TEXT = '您的⾦钱不⾜';end if;end$$delimiter ;update buyer set money = money - 2;--如果事件是insert, 则只有new没有olddrop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer before insert on buyerfor each rowbegininsert into seller values(, old.money); #报错end$$delimiter ;insert into buyer values('狗剩', 1000)--如果事件是delete,则只有old没有newdrop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer before delete on buyerfor each rowbegininsert into seller values(, new.money); #报错end$$delimiter ;delete from buyer where name = '狗蛋';ps: 触发器不能同名现在mysql只⽀持⼀类事件设置⼀个触发器--充钱取钱create table yaoye(id int primary key auto_increment,name char(80),age tinyint(4) unsigned);create table fd(fid int primary key,fname char(80),fage tinyint(4) unsigned);针对⼀个帐号存钱取钱当往yaoye 存钱的时候,要在fd显⽰出来drop trigger if exists mtri;delimiter $$ #更改默认的结束符号为 $$create trigger mtri before update on yaoye for each rowbegindeclare nowMoney float; # 申明⼀个变量nowMoney ,数据类型是floatselect ymoney into nowMoney from yaoye where id = 1;if(old.ymoney - new.ymoney < nowMoney)thenupdate fd set fmoney = fmoney - ( old.ymoney - new.ymoney ) where fid = new.id; # new.ymoney 现在的钱 , old.ymoney 原先的钱elseif(old.ymoney - new.ymoney > nowMoney)thenset new.ymoney = old.ymoney; #end if;end $$delimiter ;if()then ;elseifthenelseifthen ...;elsesql代码end if;*************************************************************************************************************mysql函数条件判断函数1: if(expr, v1, v2): 如果expr这个条件成⽴,则执⾏v1,否则执⾏v2;例: select if(1=0, 1, 0);2: case when expr1 then v1when expr2 then v2else v3 end例: select stu_no, stu_sex, case when stu_sex='男' then concat(stu_name,'⼤帅哥')when stu_sex='⼥' then concat(stu_name,'⼩美⼥')else stu_name end as '姓名'from student;系统信息函数1: select version(); 获取数据库系统版本号2: select connection_id(); 获取数据库连接数3: select database()/schema(); 获取当前数据库4: select user(); 获取当前⽤户名加密函数1: select password(str) 对str加密2: select md5(str) 对str进⾏md5的加密其它1: inet_aton(ip) 把ip转化为数值来表⽰例: select inet_aton('192.16.70.100');2: inet_ntoa(n) 把⼀个数值转化ip例: select inet_ntoa(3222292068);⾃定义函数(函数不能返回结果集)语法格式: create function 函数名(参数列表) returns 返回值类型begin函数体;end;例: ⾃定义⼀个返回矩形的⾯积的函数delimiter $$create function rectangle_area(w double, h double) returns doublebegindeclare value double default 0;set value := w*h;return value;end$$delimiter ;调⽤: select rectangle_area(3, 100);⾃定义函数: 因为官⽅函数是有限的,所以特殊的需求需要⾃⼰创造语法【不带参数】:drop function if exists 函数的名字;delimiter $$create function 函数的名字()returns 数据类型beginsql语句块end $$delimiter ;语法【带参数】:drop function if exists 函数的名字;delimiter $$create function 函数的名字(参数名字1 数据类型1,参数名字2 数据类型2.....)returns 数据类型beginsql语句块end $$delimiter ;eg:drop function if exists xiaokun;delimiter $$create function xiaokun()returns varchar(100)beginreturn "风度迷彩你好帅!!帅的我想揍你!!";end $$delimiter ;怎么调⽤select 函数名();monkey(num1,num2,opeart);select monkey(23,45,"+");select monkey(10,45,"*");select monkey(16,8,"-");select monkey(16,8,"/");drop function if exists monkey;delimiter $$create function monkey(num1 float,num2 float,opeart varchar(100))returns float begindeclare ope varchar(80); # 申明变量ope,数据类型是 varchar(80)select trim(opeart) into ope; # 将opeart的值赋给 opeif(ope != "")thenif(ope = "+")then return num1 + num2;elseif(ope = "-")then return num1 - num2;elseif ope = "*"then return num1 * num2;elseif ope = "/"then return num1 / num2;end if;elsereturn 0;end if;end $$delimiter ;查看函数select type, db, name from mysql.proc;select type, db, name from mysql.proc where type = 'FUNCTION';删除函数drop function rectangle_area;---------------------作者:Casablanca_jhBi来源:CSDN原⽂:https:///weixin_37243717/article/details/79090304版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接!。
MySQL触发器和更新操作

MySQL触发器和更新操作⼀、触发器概念触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,例如当对⼀个表进⾏操作( insert,delete, update)时就会激活它执⾏。
触发器经常⽤于加强数据的完整性约束和业务规则等。
触发器创建语法四要素:1.监视地点(table)2.监视事件(insert/update/delete)3.触发时间(after/before)4.触发事件(insert/update/delete)触发器基本语法如下所⽰:其中:trigger_time是触发器的触发事件,可以为before(在检查约束前触发)或after(在检查约束后触发);trigger_event是触发器的触发事件,包括insert、update和delete,需注意对同⼀个表相同触发时间的相同触发事件,只能定义⼀个触发器;可以使⽤old和new来引⽤触发器中发⽣变化的记录内容。
触发器SQL语法:create trigger triggerNameafter/before insert/update/delete on表名for each row #这句话在mysql是固定的beginsql语句;end;推荐⼤家阅读:/zzwlovegfj/archive/2012/07/04/2576989.html (MySQL触发器(trigger)同时使⽤Navicat for MySQL创建触发器⽅法如下图所⽰,但是建议使⽤语句操作。
⾸先在Navicat for MySQL找到需要建⽴触发器对应的表,右键“设计表”,然后创建触发器。
⼆、简单的Insert触发器假设存在⼀张学⽣表(student),包括学⽣的基本信息,学号(stuid)为主键。
另外存在⼀张成绩表(cj),对应每个学⽣包括⼀个值。
MySQL中的触发器应用技巧与实例

MySQL中的触发器应用技巧与实例引言MySQL是一款开源的关系型数据库管理系统,被广泛应用于各种规模的企业应用系统中。
触发器是MySQL数据库中的一项重要功能,它能够在数据库发生特定事件时自动执行一定的操作,可以为开发人员提供更灵活和高效的数据处理方式。
本文将讨论MySQL中的触发器应用技巧并给出实例,以帮助读者更好地应用触发器来实现数据处理需求。
一、触发器的基本概念与使用1. 触发器概述触发器是MySQL中用于定义与表相关联的操作的存储过程。
它可以在对表进行插入、更新、删除等操作时自动触发,并执行一系列预定义的操作。
触发器可以用来确保数据完整性、数据验证、数据转换等。
使用触发器可以极大地简化应用层代码,并避免潜在的数据错误。
2. 触发器的创建与删除在MySQL中,我们可以使用CREATE TRIGGER语句来创建触发器。
CREATE TRIGGER语句包含了触发器的名称、触发事件(INSERT、UPDATE或DELETE)、触发时机(BEFORE或AFTER)以及触发操作所需执行的代码。
例如,下面是一个创建触发器的示例:```CREATE TRIGGER my_triggerAFTER INSERT ON my_tableFOR EACH ROWBEGIN-- 触发器代码END;```要删除触发器,可以使用DROP TRIGGER语句。
例如,下面是一个删除触发器的示例:```DROP TRIGGER my_trigger;```3. 触发器的语法和限制MySQL中触发器的语法和存储过程非常相似,可以使用变量、流程控制语句、SQL语句等来编写触发器代码。
在编写触发器时需要注意以下几点限制:- 触发器只能在表级别上定义,不能定义在视图、存储过程或函数中。
- 一个表可以有多个触发器,但每种触发事件(INSERT、UPDATE或DELETE)只能有一个触发器。
- 触发器执行的代码不得超过16MB。
- 触发器只能对同一张表进行操作,不能对其他表进行操作。
mysql 触发器底层实现原理

mysql 触发器底层实现原理MySQL触发器是MySQL数据库中的一种特殊对象,它可以在数据库中的表发生特定事件时自动执行一系列的操作。
触发器的底层实现原理是通过在数据库内部维护一个触发器列表,并在满足触发器条件时执行相应的操作。
触发器的实现原理可以分为两个主要步骤:触发器的创建和触发器的执行。
1. 触发器的创建:当用户在数据库中创建一个触发器时,MySQL会将触发器的定义信息存储在系统表中,以便在满足触发器条件时可以快速找到并执行相应的触发器操作。
触发器的定义信息包括触发器所属的表、触发器的事件类型(如INSERT、UPDATE、DELETE)、触发器的条件和触发器的操作。
2. 触发器的执行:当满足触发器的条件时,MySQL会自动调用触发器的操作。
触发器的操作可以是SQL语句,也可以是存储过程或函数。
触发器的操作可以访问和修改当前触发的表的数据,也可以访问和修改其他表的数据。
在触发器执行过程中,MySQL会自动设置一些特殊的变量,以便在触发器操作中使用。
例如,可以使用NEW关键字引用插入或更新操作的新行数据,使用OLD关键字引用更新或删除操作的旧行数据。
触发器的执行顺序是根据触发器创建的顺序决定的。
如果有多个触发器满足同一个事件类型和触发器条件,它们的执行顺序将按照它们创建的先后顺序执行。
触发器的底层实现原理主要依赖于MySQL的内部机制和数据结构。
MySQL使用了一些数据结构来存储和管理触发器的定义信息,例如系统表和触发器列表。
同时,MySQL还使用了一些内部机制来检测和触发触发器的执行,例如事件处理器和触发器执行器。
触发器的底层实现原理的细节是MySQL的内部实现机制,对于一般用户来说并不需要了解。
用户只需要知道如何创建和使用触发器即可。
同时,在实际应用中,需要注意触发器的性能和效率问题。
触发器的操作会在每次触发事件时执行,如果触发器的操作复杂或数据量大,可能会影响数据库的性能。
因此,在使用触发器时,需要合理设计和使用,避免不必要的性能问题。
MySQL触发器简介

MySQL触发器简介MySQL数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用CALL 语句来调用,而触发器的执行不需要使用CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被MySQL自动调用。
引发触发器执行的事件一般如下:•增加一条学生记录时,会自动检查年龄是否符合范围要求。
•每当删除一条学生信息时,自动删除其成绩表上的对应记录。
•每当删除一条数据时,在数据库存档表中保留一个备份副本。
触发程序的优点如下:•触发程序的执行是自动的,当对触发程序相关表的数据做出相应的修改后立即执行。
•触发程序可以通过数据库中相关的表层叠修改另外的表。
•触发程序可以实施比FOREIGN KEY 约束、CHECK 约束更为复杂的检查和操作。
触发器与表关系密切,主要用于保护表中的数据。
特别是当有多个表具有一定的相互联系的时候,触发器能够让不同的表保持数据的一致性。
在MySQL 中,只有执行INSERT、UPDATE 和DELETE 操作时才能激活触发器。
在实际使用中,MySQL 所支持的触发器有三种:INSERT 触发器、UPDATE 触发器和DELETE 触发器。
1) INSERT 触发器在INSERT 语句执行之前或之后响应的触发器。
使用INSERT 触发器需要注意以下几点:•在INSERT 触发器代码内,可引用一个名为NEW(不区分大小写)的虚拟表来访问被插入的行。
•在BEFORE INSERT 触发器中,NEW 中的值也可以被更新,即允许更改被插入的值(只要具有对应的操作权限)。
•对于AUTO_INCREMENT 列,NEW 在INSERT 执行之前包含的值是0,在INSERT 执行之后将包含新的自动生成值。
2) UPDATE 触发器在UPDATE 语句执行之前或之后响应的触发器。
使用UPDATE 触发器需要注意以下几点:•在UPDATE 触发器代码内,可引用一个名为NEW(不区分大小写)的虚拟表来访问更新的值。
MySQL教程115-MySQL查看触发器

MySQL教程115-MySQL查看触发器查看触发器是指查看数据库中已经存在的触发器的定义、状态和语法信息等。
MySQL 中查看触发器的⽅法包括 SHOW TRIGGERS 语句和查询information_schema 数据库下的 triggers 数据表等。
下⾯将详细介绍这两种查看触发器的⽅法。
SHOW TRIGGERS语句查看触发器信息在 MySQL 中,可以通过 SHOW TRIGGERS 语句来查看触发器的基本信息,语法格式如下:SHOW TRIGGERS [FROM <数据库名>] [LIKE_OR_WHERE];⽰例 1查看数据库test_tb中的触发器, 如果是查看当前数据库中的触发器, 可以不写[FROM <DBNAME>]mysql> show triggers\G;***************************1. row ***************************Trigger: double_salaryEvent: INSERTTable: tb_emp6Statement: begininsert into tb_emp7 values (null, , new.deptId, new.salary*2);endTiming: BEFORECreated: 2020-08-2714:35:47.02sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@%character_set_client: utf8mb4collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8_general_ci***************************2. row ***************************Trigger: SumOfSalaryEvent: INSERTTable: tb_emp8Statement: begindeclare sum1 float;select sum(salary) into sum1 from tb_emp8;set@sum= sum1 + new.salary;endTiming: BEFORECreated: 2020-08-2714:17:23.23sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@%character_set_client: utf8mb4collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8_general_ci2 rows in set (0.00 sec)由运⾏结果可以看到触发器的基本信息。
MySQL中的触发器与存储过程使用方法

MySQL中的触发器与存储过程使用方法MySQL是一种开源的关系型数据库管理系统,广泛应用于各种类型的应用程序中。
在MySQL中,触发器和存储过程是两个非常重要的特性,它们能够帮助我们更好地管理和处理数据。
本文将探讨MySQL中的触发器和存储过程的使用方法,并介绍一些实际应用的案例。
一、触发器的概念与使用方法1. 触发器的概念触发器是一种与表相关联的特殊类型的存储过程,它在表中发生特定事件时被自动执行。
这些特定事件可以是INSERT、UPDATE或DELETE操作。
通过使用触发器,我们可以在数据发生变化时自动执行一些操作,如数据验证、数据更新等。
2. 创建触发器要创建一个触发器,我们需要使用CREATE TRIGGER语句。
其基本语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_nameFOR EACH ROWtrigger_body其中,trigger_name是触发器的名称,可以自定义;BEFORE或AFTER用于指定触发器是在操作之前还是之后执行;INSERT、UPDATE或DELETE用于指定触发器要触发的事件;table_name是触发器所属的表名;trigger_body是触发器的具体操作。
3. 触发器的具体应用触发器在数据库管理中有很多实际应用场景。
比如,可以使用触发器来实现数据完整性约束,通过在INSERT、UPDATE或DELETE操作之前进行数据验证,确保数据的准确性。
另外,触发器还可以用来自动更新一些计算字段,或者将一些操作日志写入其他表。
二、存储过程的概念与使用方法1. 存储过程的概念存储过程是一组在数据库服务器上预先编译过的SQL语句,它们按照特定的顺序组合在一起,形成一个可执行的过程。
存储过程类似于程序中的函数,可以接受参数、执行一系列SQL语句,并返回结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第讲:y Q触发器第15讲:MySQL触发器
课程大纲
•1、什么是触发器
•2、创建触发器
•3、查看触发器
•4、删除触发器
1、什么是触发器
•“在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。
”
•它是在一个特殊的数据库事件,如INSERT、UPDATE或DELETE发生时,自动激活的一段代码。
•MySQL从5.0.2版本开始支持触发器。
2、创建触发器
•语法:
•CREATE TRIGGER 触发器名
{|}
•{BEFORE | AFTER} # 触发时间•{INSERT | UPDATE | DELETE}# 触发事件•ON 表名FOR EACH ROW 要触发的SQL语句;
•
2、创建触发器
•使用别名OLD和NEW,能够引用与触发程序相关的表中的列。
OLD.col_name在更新或删除它之前,引用已有行中的1列。
NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列。
•
•触发器只能定义在永久表上,不能对临时表创建。
•MySQL对同一个表相同触发时间的相同触发事件,只能定义一个触发器。
2、创建触发器
•示例:
•CREATE TRIGGER t1
•AFTER
•INSERT
•ON data FOR EACH ROW
_();•UPDATE total SET count= CHAR LENGTH();
3、查看触发器
•查看所有的触发器
•SHOW TRIGGERS
•
4、删除触发器
•语法:
•DROP TRIGGER 触发器名;
•
THANK
YOU!
微信号:weige-java
扫一扫,关注威哥微信公众平台。