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

  • 相关阅读:
    杭电OJ 输入输出练习汇总
    七月读书笔记
    情报分析报告阅读笔记
    情报研究与分析入门阅读笔记
    旁观者攻击
    域前置技术相关学习
    CC攻击和C2的区别
    DNS投毒学习分析总结
    数字证书2.0版本学习总结
    《在树洞里》-感悟
  • 原文地址:https://www.cnblogs.com/toughzcf/p/10112430.html
Copyright © 2020-2023  润新知