关于mysql中触发器的使用

版权声明:博主原创转载请注明出处:https://blog.csdn.net/qq_42952331 https://blog.csdn.net/qq_42952331/article/details/85019576
触发器
    在当前的表上,设置一个对每行数据的一个监听器,监听相关事件,每当事件触发时,就会执行一段由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;

猜你喜欢

转载自blog.csdn.net/qq_42952331/article/details/85019576
今日推荐