• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySql视图触发器存储过程详解

    视图:

      一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称。视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图。

      创建:

        create view v1 as SQL

    例如:create view v1 as select * from student where sid10

    创建后如果使用mysql终端可以看到一个叫v1的表,如果用navicate可以在视图中看到生成了一个v1的视图

    再次使用时,可以直接使用查询表的方式。例如:select * from v1

      修改:只能修改视图中的sql语句

        alter view 视图名称 as sql

      删除:

        drop view 视图名称

    触发器:

      当对某张表做增删改查的时候(之前后者之后),就可以使用触发器自定义关联行为。

      修改sql语句中的终止符号 delimiter

    before after 之前之后

    -- delimiter //
      
    -- before或者after定义操作(insert或其他)之前或之后的操作
    -- on 代表那张表发生操作后引发触发器操作
     
    -- CREATE TRIGGER t1 BEFORE INSERT on teacher for EACH row
    -- BEGIN
    -- INSERT into course(cname) VALUES('奥特曼');
    -- END //
    -- delimiter ;
     
     
    -- insert into teacher(tname) VALUES('triggertest111')
    --
    -- delimiter // 
    -- CREATE TRIGGER t1 BEFORE INSERT on student for EACH row
    -- BEGIN
    -- INSERT into teacher(tname) VALUES('奥特曼');
    -- END //
    -- delimiter ;
     
     
    -- insert into student(gender,sname,class_id) VALUES('男','1小刚111',3);
    -- 删除触发器
    -- drop trigger t1;
     
     
    -- NEW 和 OLD 代指新老数据 使其数据一致
    -- delimiter //
    -- create TRIGGER t1 BEFORE insert on student for each row
    -- BEGIN
     
    --这里的new 指定的是新插入的数据,old通常用在delete上
     
    -- insert into teacher(tname) VALUES(NEW.sname);
    -- end //
    -- delimiter ;
    insert into student(gender,sname,class_id) VALUES('男','蓝色的大螃蟹',3);

    存储过程:

    本质上就是一堆sql的集合,然后给这个集合起个别名。和view的区别就是,视图是一个sql查询语句当成一个表。

        方式:

          1 msyql----存储过程,供程序调用

          2 msyql---不做存储过程,程序写sql

          3 mysql--不做存储过程,程序写类和对象(转化成sql语句)    

        创建方法:

    -- 1 创建无参数的存储过程
    -- delimiter //
    -- create PROCEDURE p1()
    -- BEGIN
    -- select * from student;
    -- insert into teacher(tname) VALUES('cccc');
    -- end //
    -- delimiter ;

    -- 调用存储过程

     call p2(5,2)br data-filtered="filtered">br data-filtered="filtered">em id="__mceDel"> pymysql中 cursor.callproc('p1',(5,2))/em>
    --  2 带参数 in 参数
     
    -- delimiter //
    -- create PROCEDURE p2(
    --  in n1 int,
    -- in n2 int
    -- )
    -- BEGIN
    --  select * from student where sidn1;
    -- 
    -- end //br data-filtered="filtered">br data-filtered="filtered"> call p2(5,2)br data-filtered="filtered">br data-filtered="filtered">em id="__mceDel"> pymysql中 cursor.callproc('p1',(5,2))/em>
    -- 3  out参数 在存储过程入参时 使用out则 该变量可以在外部进行调用
    --    存储过程中没有return 如果想要在外部调用变量则需要使用out
    -- delimiter //
    -- create PROCEDURE p3(
    --  in n1 int,
    -- out n2 int
    -- )
    -- BEGIN
    --  set n2=444444;
    --  select * from student where sidn1;
    -- 
    -- end //
    --
    -- delimiter ;
    --
    -- set @v1=999  相当于 在session级别 创建一个变量
    -- set @v1=999; 
    -- call p3(5,@v1);
    -- select @v1; #通过传一个变量进去,然后监测这个变量就可以监测到存储过程是否执行成功
     
    -- pymsyql中
    --  
    -- cursor.callproc('p3',(5,2))
    -- r2=cursor.fetchall()
    -- print(r2)
    --
    -- 存储过程含有out关键字 如果想要拿到返回值  cursor.execute('select @_p3_0,@_p3_1')
    -- # 其中 'select @_p3_0,@_p3_1'为固定写法 select @_存储过程名称_入参索引位置
    -- cursor.execute('select @_p3_0,@_p3_1')
    -- r3=cursor.fetchall()
    -- print(r3)
    --

      为什么有了结果集,又要有out伪造返回的值?

          因为存储过程中含有多个sql语句,无法判断所有的sql都能执行成功,利用out的特性来标识sql是否执行成功。

          例如,如果成功标识为1 部分成功标识2 失败为3

      存储过程中的事务:

        事务:

          被成为原子性操作。DML(insert,update,delete)语句共同完成,事物只和DML语句相关,或者锁只有DML才有事物。

        事务的特点:

          原子性 A :事务是最小单位,不可分割

          一致性 C :事务要求所有dml语句操作的时候必须保证全部成功或者失败

          隔离性 I : 事务A和事务B之间有隔离性

          持久性 D : 是事务的保证,事务终结的标志(内存中的数据完全保存到硬盘中)

        事务关键字:

          开启事务:start transaction

          事务结束 :end transaction

          提交事务 :commit transaction

          回滚事务 :rollback transaction

        事务的基本操作

    delimiter //
     create procedure p5(
     in n1 int,
     out n2 int
     )
     begin
     1 声明如果出现异常执行(
       set n2=1;
       rollback;
      )
      2 开始事务
         购买方账号-100
            卖放账号+100
            commit
      3 结束
        set n2=2
       end //
       
       delimiter ;
       
     这样 既可以通过n2 检测后到错误 也可以回滚
      
      以下是详细代码
    delimiter //
      create procedure p6(
      out code TINYINT
      )
      begin
       声明如果碰到sqlexception 异常就执行下边的操作
       DECLARE exit HANDLER for SQLEXCEPTION
       begin
        --error
          set code=1;
          rollback;
       end;
       START TRANSACTION;
           delete from tb1;
           insert into tb2(name)values('slkdjf')
       commit;
       ---success
       code=2
       end //
    delimiter ;

        游标在存储过程中的使用:

    delimiter //
    create procedure p7()
     begin
        declare row_id int;
         declare row_num int;
         declare done int DEFAULT FALSE;
         声明游标
         declare my_cursor cursor for select id,num from A;
         声明如果没有数据 则将done置为True
         declare continue handler for not found set done=True;
         
         
         open my_cursor;  打开游标
             xxoo;LOOP   开启循环叫xxoo
                fetch my_cursor into row_id,row_num;
                  if done then 如果done为True 离开循环
                    leave xxoo;
                  end if;
                  set temp=row_id+row_num;
           insert into B(number)VALUES(temp);
                end loop xxoo; 关闭循环
          close my_cursor;
        end //
         
    delimiter ;
     
     
    以上代码 转化成python 
    for row_id,row_num in my_cursor:
      检测循环中是否还有数据,如果没有则跳出 break
        break
        insert into B(num) values(row_id+row_num)

        动态的执行sql,数据库层面放置sql注入:

    delimiter \\
    create procedure p6(
     in nid int)
     begin
      1 预编译(预检测)某个东西 sql语句合法性
       2 sql=格式化tpl+arg
        3 执行sql
     
      set @nid=nid
        prepare prod from 'select * from student where sid>?'
        EXECUTE prod using @ nid;
        deallocate prepare prod
      end \\
      delimiter ;

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Mysql触发器在PHP项目中用来做信息备份、恢复和清空
    • 一篇文章带你深入了解Mysql触发器
    • MySQL触发器的使用
    • 详解MySQL数据库之触发器
    • mysql 触发器语法与应用示例
    • mysql触发器实时检测一条语句进行备份删除思路详解
    上一篇:mysql 8.0.20 安装配置详细教程
    下一篇:window10下mysql 8.0.20 安装配置方法图文教程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySql视图触发器存储过程详解 MySql,视图,触发器,存储,