• 视图,触发器,事务与存储过程


    视图

    什么是视图

    视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可1、什么是视图
    视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可

    为什么要用视图

    如果要频繁使用一张虚拟表,可以不用重复查询

    如何创建视图

    create view teacher2course as
    select * from teacher inner join course
        on teacher.tid = course.teacher_id;
    

    强调

    1、在硬盘中,视图只有表结构文件,没有表数据文件
    2、视图通常是用于插叙,尽量不要修改视图中的数据

    删除视图

    drop view teacher2course;
    

    触发器

    什么是触发器

    在满足对某张表数据的增,删,改的情况下,自动触发的功能称之为触发器

    为什么要用触发器

    触发器专门针对我们对某一张表数据增insert、删delete、改update的行为,这类行为一旦执行就会触发触发器的执行,即自动运行另外一段sql代码

    创建触发器的语法

    # 针对插入
    create trigger tri_after_insert_t1 after insert on 表名 for each row
    begin
        sql代码。。。
    end
    
    create trigger tri_after_insert_t2 before insert on 表名 for each row
    begin
        sql代码。。。
    end
    
    
    # 针对删除
    create trigger tri_after_delete_t1 after delete on 表名 for each row
    begin
        sql代码。。。
    end
    
    create trigger tri_after_delete_t2 before delete on 表名 for each row
    begin
        sql代码。。。
    end
    
    
    # 针对修改
    create trigger tri_after_update_t1 after update on 表名 for each row
    begin
        sql代码。。。
    end
    
    create trigger tri_after_update_t2 before update on 表名 for each row
    begin
        sql代码。。。
    end
    

    案例代码

    CREATE TABLE cmd (
        id INT PRIMARY KEY auto_increment,
        USER CHAR (32),
        priv CHAR (10),
        cmd CHAR (64),
        sub_time datetime, #提交时间
        success enum ('yes', 'no') #0代表执行失败
    );
    
    CREATE TABLE errlog (
        id INT PRIMARY KEY auto_increment,
        err_cmd CHAR (64),
        err_time datetime
    );
    
    delimiter $$
    create trigger tri_after_insert_cmd after insert on cmd for each row
    begin
        if NEW.success = 'no' then
            insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
        end if;
    end $$
    delimiter ;
    

    注意

    上面的代码中: delimiter $$ 和deliniter ;
      sql中;为语句的默认结束符号,为了让sql正确识别语句,所以需要修改默认的结束符号。
      语句完成之后,再次修改为默认的符号。
    

    删除触发器

    drop trigger tri_after_insert_cmd;
    

    事务

    什么是事务

    开启一个事务可以包含一些sql语句,这些sql语句要么同时成功,要么一个都
    别想成功,称之为事务的原子性

    事务的作用

    事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

    事务的使用

    create table user(
    id int primary key auto_increment,
    name char(32),
    balance int
    );
    
    insert into user(name,balance)
    values
    ('wsb',1000),
    ('egon',1000),
    ('ysb',1000);
    
    try:
        update user set balance=900 where name='wsb'; #买支付100元
        update user set balance=1010 where name='egon'; #中介拿走10元
        update user set balance=1090 where name='ysb'; #卖家拿到90元
    except 异常:
        rollback; #出现异常,进行回滚操作
    else:
        commit;#没有异常,则提交修改
    

    存储过程

    什么是存储过程

    存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql

    三种开发模型

    一、        
    

    应用程序:只需要开发应用程序的逻辑
    mysql:编写好存储过程,以供应用程序调用
    优点:开发效率,执行效率都高
    缺点:考虑到人为因素、跨部门沟通等问题,会导致扩展性差
    二、
    应用程序:除了开发应用程序的逻辑,还需要编写原生sql
    mysql:不做操作
    优点:比方式1,扩展性高(非技术性的)
    缺点:
    1、开发效率,执行效率都不如方式1
    2、编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题
    三、
    应用程序:开发应用程序的逻辑,不需要编写原生sql,基于别人编写好的框架来处理数据,ORM
    mysql:不做操作
    优点:不用再编写纯生sql,这意味着开发效率比方式2高,同时兼容方式2扩展性高的好处
    缺点:执行效率连方式2都比不过

    创建存储过程

    对于存储过程,可以接收参数,其参数有三类:
    in 仅用于传入参数用
    out 仅用于返回值用
    inout 既可以传入又可以当作返回值

    delimiter $$
    create procedure p1(
        in m int,
        in n int,
        out res int
    )
    begin
        select tname from teacher where tid > m and tid < n;
        set res=0;
    end $$
    delimiter ;
    

    如何用存储过程
    1、直接在mysql中调用
    set @res=10
    call p1(2,4,10);
    查看结果
    select @res;

    2、在python程序中调用
    cursor.callproc('p1')
    print(cursor.fetchall())

    3、事务的使用---与存储过程的结合

    delimiter //
    create PROCEDURE p5(
        OUT p_return_code tinyint
    )
    BEGIN
        DECLARE exit handler for sqlexception
        BEGIN
            -- ERROR
            set p_return_code = 1;
            rollback;
        END;
    
        DECLARE exit handler for sqlwarning
        BEGIN
            -- WARNING
            set p_return_code = 2;
            rollback;
        END;
    
        START TRANSACTION;
            update user set balance=900 where id =1;
            update user123 set balance=1010 where id = 2;
            update user set balance=1090 where id =3;
        COMMIT;
    
        -- SUCCESS
        set p_return_code = 0; #0代表执行成功
    
    END //
    delimiter ;
    

    删除存储过程
    drop procedure proc_name;

    函数

    !!!注意!!!
    函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能
    若要想在begin...end...中写sql,请用存储过程

    流程控制

    全文参考

  • 相关阅读:
    css区分ie6,7,ff
    轮播插件--可支持视频拖拽和可视区播放
    json无限树----几个月前写的插件
    WEBGL学习笔记二
    记录一些坑
    webGL学习笔记一
    Angular模态框
    Angular指令实践之type等于text的input星号输入
    Angular内置指令
    Angular指令一
  • 原文地址:https://www.cnblogs.com/guodengjian/p/9038534.html
Copyright © 2020-2023  润新知