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版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接!。