zoukankan      html  css  js  c++  java
  • Mysql 视图&事务&触发器

    参考资料

    一、视图

    视图的含义:

    视图是一个虚拟表,是从数据库中一个或者多个表中导出来的表。

    1、创建视图

    #语法:CREATE VIEW 视图名称 AS  SQL语句
    create view teacher_view as select tid from teacher where tname='李平老师';
    
    #于是查询李平老师教授的课程名的sql可以改写为
    mysql> select cname from course where teacher_id = (select tid from teacher_view);
    +--------+
    | cname  |
    +--------+
    | 物理   |
    | 美术   |
    +--------+
    rows in set (0.00 sec)
    
    #!!!注意注意注意:
    #1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高
    
    #2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,
    那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,
    你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便

    2、查看视图

    select * from course_view;

    create view view_sc as select * from sc;
    select * from view_sc;
    desc view_sc;
    show create view view_sc;

     3、修改视图

    修改视图:
    语法:ALTER VIEW 视图名称 AS SQL语句
    ALTER alter view view_sc as select * from student; select * from view_sc;

    查看数据库中原有的视图

    select * from information_schema.views; 
    
    

    4、更新视图

    更新视图是指通过插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。
    通过视图更新的时候都是转到基本表进行更新的,
    如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录

    建立视图一般是为了查看,不建议更新操作

    5、删除视图

    语法:DROP VIEW 视图名称
    
    DROP VIEW teacher_view

     二、事务

    1、定义

    事务就是将一组SQL语句放在同一批次内去执行
    如果一个SQL语句出错,则该批次内的所有SQL都将被执行

    事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。                      
       
    一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性

     2、事务的ACID原则

    ACID,指数据库事务正确执行的四个基本要素的缩写。
    包含:
    原子性(Atomicity)、最小单元,保证一个操作作为一个过程去处理

    一致性(Consistency)、如果其中有任何步骤失败,整个过程回滚(回到原始状态)

    隔离性(Isolation)、事物之间互不影响,相互独立

    持久性(Durability),事务提交成功后,会永久的存储,状态不会再改变
    一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。 使用场景: 银行的交易系统 eg: start transaction; update user set balance
    = 900 where name = 'wsb'; #买支付100元 update user set balance = 1010 where name = 'egon'; #中介拿走10元 uppdate user set balance = 1090 where name = 'ysb'; #卖家拿到90元,出现异常没有拿到 rollback; commit;

    3、MYSQL事务实现的方法

    (1)set autocommit

    使用set语句来改变自动提交模式

    SET AUTOCOMMIT  = 0;    # 关闭自动提交模式
    
    SET AUTOCOMMIT  = 1;    # 开启自动提交模式
    MySQL中默认是自动提交
    使用事务时应先关闭自动提交
    1 查看提交模式
    select @@autocommit;


    2 关闭自动提交模式
    set autocommit=0;

    
    

    案例分析:

    顾客A在线购买一款商品,价格为500.00元,采用网上银
        行转账的方式支付
    假如顾客A银行卡的余额为2000.00元,且向卖家B支付购
        买商品费用500.00元,起始卖家B的账号金额10000.00元
    创建数据库shop和创建表account并插入2条数据
    创建表 shop表
    create table shop(
    name VARCHAR(32) not null,
    cash int(4)
    );
    
    插入数据:
    insert into shop VALUES('A',2000),('B',10000)

    插入数据不成功,因为上一步把自动提交关闭了

    set autocommit=1;
    insert into shop VALUES('A',2000),('B',10000)

    关闭自动提交模式
    set autocommit=0;

     4、事务的语法

    关闭自动提交模式
    set autocommit=0;
    start transaction;
    update shop set cash=cash-500 where name='A';
    update shop set cash=cash+500 where name='B';
    select * from shop;

    没有提交,只是显示操作后的状态,但实际数据依旧没变
    ROLLBACK; 没有commit回滚回到原来的状态
    commit; 先提交再回滚,也不会回到最初的状态,而是出现提交后的状态


    最后还原自动提交模式
    set autocommit=1;

    三、触发器

     trigger 英 /'trɪgə/ 美 /'trɪɡɚ/   vt 触发、引发

    使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

    1、定义

    在某种操作执行的同时触发另一种操作。它的执行不是由程序调用,也不是手工启动,而是由事件来触发,
    比如当对一个表进行操作( insert,delete, update)时就会激活它执行。

    2、触发器的语法

    3、案例分析

    student表 每插入一条数据,计数表就计数
    由于没有计数表,先创建
    create table account(
    stu_count int(4),
    change_time datetime
    );
    
    触发器
    create trigger tir_stu
    after 
    insert 
    on student 
    for each row 
    begin
    update account set stu_count=stu_count+1,change_time=now();
    end;
    
    先运行触发器,创建触发器
    
    select * from account;
    
    在执行插入之前必须要数据
    INSERT into account VALUES((select count(*) from student),NOW());
    
    student表插入数据
    INSERT into student VALUES(1014,'cc',12,1);

     4、触发器的删除

    drop trigger 触发器名

     

    MySQL触发器是在5.0版本引入的。针对需要对数据库做级联更改是很适宜使用的,如需要实时监控某张表中的某个字段的更改而需要做出相应的处理。
    
    触发器虽然功能强大,能轻松可靠的实现许多复杂的功能不过,要慎用触发器,滥用触发器会造成数据库以及应用程序维护困难。
  • 相关阅读:
    mvn 创建的项目 导入到eclipse
    maven GroupID和ArtifactID
    eclipse配置maven + 创建maven项目
    微服务简介
    spring-boot5代码
    spring-boot5
    TextView及其子类
    RTMP协议
    实现输出h264直播流的rtmp服务器
    Android按键事件传递流程(二)
  • 原文地址:https://www.cnblogs.com/foremostxl/p/11409499.html
Copyright © 2011-2022 走看看