mysql_触发器、函数、if的使用

触发器
在当前的表上,设置一个对每行数据的一个监听器,监听相关事件,每当事件触发时,就会执行一段由sql完成的一段功能代码

触发事件:

insert, delete, update
new old : 针对的是触发的那张表 on 表名
insert : 没有 old 有new 【对于插入,插入之前什么都没有,插入之后才有数据】

update : 有old 有new

delete : 有old 没有new

因为数据的改变不是固定,所以需要获取触发程序时的数据
old: 表示事件发生之前的数据, 旧的数据
new: 表示事件发生之后的数据, 新的数据


事件的时机: after(表示执行之后), before(表示执行之前);

事件和时机组合在一起一共有六种事件
before insert, before delete, before update
after insert, after delete, after update

监听的地点: table(表),事件规定在哪个表上的哪个时机的什么动作上

**************************************************************************************************
创建触发器
语法格式
create trigger trigger_name [六种情况] on table_name
for each row
begin
sql 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 buyer
for each row
begin
update 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 buyer
for each row
begin
# 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 buyer
for each row
begin
if new.money >= 0 then
update seller set money = money + (old.money - new.money);
else
SIGNAL SQLSTATE 'HY000' set MESSAGE_TEXT = '您的金钱不足';
end if;
end$$
delimiter ;

update buyer set money = money - 2;


--如果事件是insert, 则只有new没有old
drop trigger if exists tr_buyer;
delimiter $$
create trigger tr_buyer before insert on buyer
for each row
begin
insert into seller values(old.name, old.money); #报错
end$$
delimiter ;
insert into buyer values('狗剩', 1000)


--如果事件是delete,则只有old没有new
drop trigger if exists tr_buyer;
delimiter $$
create trigger tr_buyer before delete on buyer
for each row
begin
insert into seller values(new.name, 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 row
begin
declare nowMoney float; # 申明一个变量nowMoney ,数据类型是float
select ymoney into nowMoney from yaoye where id = 1;
if(old.ymoney - new.ymoney < nowMoney)
then
update fd set fmoney = fmoney - ( old.ymoney - new.ymoney ) where fid = new.id; # new.ymoney 现在的钱 , old.ymoney 原先的钱
elseif(old.ymoney - new.ymoney > nowMoney)
then
set new.ymoney = old.ymoney; #
end if;
end $$
delimiter ;

 


if()
then ;
elseif
then
elseif
then ...;
else
sql代码
end if;

*************************************************************************************************************

mysql函数
条件判断函数
1: if(expr, v1, v2): 如果expr这个条件成立,则执行v1,否则执行v2;
例: select if(1=0, 1, 0);
2: case when expr1 then v1
when expr2 then v2
else 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 double
begin
declare 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 数据类型
begin
sql语句块
end $$
delimiter ;

语法【带参数】:

drop function if exists 函数的名字;
delimiter $$
create function 函数的名字(参数名字1 数据类型1,参数名字2 数据类型2.....)returns 数据类型
begin
sql语句块
end $$
delimiter ;

eg:
drop function if exists xiaokun;
delimiter $$
create function xiaokun()returns varchar(100)
begin
return "风度迷彩你好帅!!帅的我想揍你!!";
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
begin
declare ope varchar(80); # 申明变量ope,数据类型是 varchar(80)
select trim(opeart) into ope; # 将opeart的值赋给 ope
if(ope != "")
then
if(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;
else
return 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://blog.csdn.net/weixin_37243717/article/details/79090304
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2018-12-13 10:12  toughzcf  阅读(7044)  评论(0编辑  收藏  举报