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

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

    2、为什么要用视图
    如果要频繁使用一张虚拟表,可以不用重复查询

    3、如何用视图

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


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


    drop view teacher2course;
    ————————————————————————————————————————————————————————————————————————————————
    01 触发器
    在满足对某张表数据的增、删、改的情况下,自动触发的功能称之为触发器

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

    03 创建触发器语法
    # 针对插入
    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

    04 案例
    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 ;


    drop trigger tri_after_insert_cmd;

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

    02 事务的作用


    03 如何用
    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;
    ————————————————————————————————————————————————————————
    01 存储过程
    存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql


    02 三种开发模型
    1、
    应用程序:只需要开发应用程序的逻辑
    mysql:编写好存储过程,以供应用程序调用

    优点:开发效率,执行效率都高
    缺点:考虑到人为因素、跨部门沟通等问题,会导致扩展性差

    2、
    应用程序:除了开发应用程序的逻辑,还需要编写原生sql
    mysql:

    优点:比方式1,扩展性高(非技术性的)
    缺点:
    1、开发效率,执行效率都不如方式1
    2、编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题


    3、
    应用程序:开发应用程序的逻辑,不需要编写原生sql,基于别人编写好的框架来处理数据,ORM
    mysql:

    优点:不用再编写纯生sql,这意味着开发效率比方式2高,同时兼容方式2扩展性高的好处
    缺点:执行效率连方式2都比不过

    03 创建存储过程

    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); 错误使用

    call p1(2,4,@res) 正确使用

    #查看结果
    select @res;

    #2、在python程序中调用
    PS: 哪里定义 哪里用

    #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 ;



    delimiter //
    create PROCEDURE p6(
    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 user set balance=1010 where id = 2;
    update user set balance=1090 where id =3;
    COMMIT;

    -- SUCCESS
    set p_return_code = 0; #0代表执行成功

    END //
    delimiter ;
    ——————————————————————————————————————————————————————
    1、强调:mysql内置的函数只能在sql语句中使用

    mysql> select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/TF511/p/10022109.html
Copyright © 2011-2022 走看看