zoukankan      html  css  js  c++  java
  • 视图,触发器,事务与存储过程

    视图

    什么是视图

    视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可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,请用存储过程

    流程控制

    全文参考

  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1160 FatMouse's Speed
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1003 Max Sum
    HDU 1297 Children’s Queue
    UVA1584环状序列 Circular Sequence
    UVA442 矩阵链乘 Matrix Chain Multiplication
    DjangoModels修改后出现You are trying to add a non-nullable field 'download' to book without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
    opencv做的简单播放器
    c++文件流输入输出
  • 原文地址:https://www.cnblogs.com/guodengjian/p/9038534.html
Copyright © 2011-2022 走看看