• MySQL 05


    事务

    基本概念

    • 事务: Transaction
    • 事务是由一个或多个sql语句构成的逻辑单元, 是一个整体的概念
    • 作用: 使得一系列sql语句要么全部完成, 要目全部不完成, 保证了数据库的完整性

    四大特性(ACID)

    • 原子性 (Atomicity): 事务是最小执行单位, 不可再分, 既一个事务中的所有操作, 要么全部完成, 要么全部不完成
    • 一致性 (Consistency): 事务开始之前和结束之后, 数据库的完整性没有被破坏
    • 隔离性 (Isolation): 数据库支持多个事务并发, 隔离性可以防止事务交叉执行导致的不一致
      • 读未提交
      • 读提交
      • 可重复读
      • 串行化
    • 持久性 (Durability): 事务处理结束后, 对数据的修改时永久的

    使用方法

    • start transaction; 开启
    • commit; 提交
    • rollback; 回滚

    第一步: 开启事务, 执行操作

    # alpha 对 bravo 转账 100
    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |  1000 |
    |  2 | bravo |  1000 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    
    # 开启事务
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> update balance set money=1000-100 where name='alpha';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> update balance set money=1000+100 where name='bravo';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |   900 |
    |  2 | bravo |  1100 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    
    

    第二步: 此时我们还未提交事物, 我们新开一个窗口, 查看一下balance表

    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |  1000 |
    |  2 | bravo |  1000 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    

    第三步: 然后我们提交事物

    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |   900 |
    |  2 | bravo |  1100 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    

    第四步: 在新的窗口查看balance表, 数据修改成功

    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |   900 |
    |  2 | bravo |  1100 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    

    如果我们在第三步的时候不提交, 回滚一下事务

    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |  1000 |
    |  2 | bravo |  1000 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    
    # 开启事务
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    
    
    mysql> update balance set money=1000-100 where name='alpha';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> update balance set money=1000+100 where name='bravo';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |   900 |
    |  2 | bravo |  1100 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    
    # 回滚事务
    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)
    
    # 数据没有被修改
    mysql> select * from balance;
    +----+-------+-------+
    | id | name  | money |
    +----+-------+-------+
    |  1 | alpha |  1000 |
    |  2 | bravo |  1000 |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    

    存储引擎

    • InnoDB (MySQL默认)

    • MyISAM (我的阿萨姆?)

    • 区别

      • InnoDB支持事务
      • InnoDB支持行锁(并发), MyISAM只支持表锁

    视图

    基本概念

    • 根据select查询语句得到一个具有名称的动态数据集, 用户只要通过视图名称就可获取这个数据集

    使用方法

    • 增加视图 create view 视图名 as select查询语句
    • 使用视图 (相当于一个表) select * from 视图名
    • 删除视图 drop view 视图名
    mysql> select * from user_info;
    +----+---------+----------+
    | id | name    | password |
    +----+---------+----------+
    |  1 | bigb    | 111111   |
    |  2 | blake   | 222222   |
    |  3 | black   | 333333   |
    |  4 | alpha   | 111111   |
    |  5 | bravo   | 222222   |
    |  6 | charlie | 333333   |
    |  7 | delta   | 111111   |
    |  8 | echo    | 222222   |
    |  9 | foxtrot | 333333   |
    +----+---------+----------+
    9 rows in set (0.00 sec)
    
    mysql> select * from user_info where name='alpha';
    +----+-------+----------+
    | id | name  | password |
    +----+-------+----------+
    |  4 | alpha | 111111   |
    +----+-------+----------+
    1 row in set (0.00 sec)
    
    # 创建视图
    mysql> create view v1 as select * from user_info where name='alpha';
    Query OK, 0 rows affected (0.01 sec)
    
    # 使用视图
    mysql> select * from v1;
    +----+-------+----------+
    | id | name  | password |
    +----+-------+----------+
    |  4 | alpha | 111111   |
    +----+-------+----------+
    1 row in set (0.00 sec)
    
    # 如果我们对原表记录进行了修改, 发现视图中的数据也进行了相应的修改, 因此通过视图得到是一个动态的数据集
    mysql> update user_info set password='888888' where name='alpha';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from v1;
    +----+-------+----------+
    | id | name  | password |
    +----+-------+----------+
    |  4 | alpha | 888888   |
    +----+-------+----------+
    1 row in set (0.00 sec)
    
    # 删除视图
    mysql> drop view v1;
    Query OK, 0 rows affected (0.00 sec)
    

    触发器

    基本概念

    • 对表1进行某些特定操作时会触发对表2的某些特定操作

    使用方法

    • 创建触发器
    delimiter 结束符号(自定义)
    create trigger 触发器名 before/after 触发事件 on 表名 for each row
    begin
    触发器触发的内容;
    end 结束符号
    
    delimiter;  # 将结束符号改回;
    
    • 例子: 实现对 t1 添加记录时 , 也向 t2 添加一条记录
    # t1 和 t2 为两个空表
    mysql> select * from t1;
    Empty set (0.00 sec)
    
    mysql> select * from t2;
    Empty set (0.00 sec)
    
    # 创建触发器
    mysql> delimiter //
    mysql> create trigger tri_nb after insert on t1 for each row
        -> begin
        -> insert into t2 (name) values ('bravo');
        -> end //
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> delimiter ;
    
    # 对 t1 进行操作
    mysql> insert into t1 (name) values ('alpha');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from t1;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | alpha |
    +----+-------+
    1 row in set (0.00 sec)
    
    mysql> select * from t2;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | bravo |
    +----+-------+
    1 row in set (0.00 sec)
    

    存储过程

    基本概念

    • 对sql语句进行了封装, 方便后期调用, 相当于MySQL中的函数

    使用方法

    • 创建
    delimiter 结束符号
    
    create procedure p1(IN 参数 int)  # IN表示传入参数, 参数类型为int
    begin
    sql语句;
    end 结束符号
    
    delimiter 结束符号
    
    
    • 使用

      • call p1(参数);
    • 删除

      • drop procedure p1;
    • 例子

    +----+---------+----------+
    | id | name    | password |
    +----+---------+----------+
    |  1 | bigb    | 111111   |
    |  2 | blake   | 222222   |
    |  3 | black   | 333333   |
    |  4 | alpha   | 888888   |
    |  5 | bravo   | 222222   |
    |  6 | charlie | 333333   |
    |  7 | delta   | 111111   |
    |  8 | echo    | 222222   |
    |  9 | foxtrot | 333333   |
    +----+---------+----------+
    
    # 创建
    mysql> delimiter //
    
    mysql> create procedure p1(IN p_in int)
        ->  begin
        ->  select * from user_info where id = p_in;
        ->  end //
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> delimiter ;
    
    # 调用
    mysql> call p1(3);
    +----+-------+----------+
    | id | name  | password |
    +----+-------+----------+
    |  3 | black | 333333   |
    +----+-------+---------+
    1 row in set (0.00 sec)
      
    

    数据备份

    备份

    • 单库备份
      • mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql
      • mysqldump -u用户名 -p密码 数据库名 表1 表2 > 备份文件.sql 对库下面的表进行备份
    • 多库备份 mysqldump -u用户名 -p密码 --databases 数据库1 数据库2 > 备份文件.sql
    • 备份所有 mysqldump -u用户名 -p密码 --all-databases > 备份文件.sql

    导入

    • source D:all.sql

    函数

  • 相关阅读:
    福大软工 · 第十次作业
    Summary #ToBeContinue......
    福大软工 · 第十二次作业
    Beta 冲刺(7/7)
    Beta 冲刺(6/7)
    Beta 冲刺(5/7)
    Beta 冲刺(4/7)
    Beta 冲刺(3/7)
    Beta 冲刺(2/7)
    福大软工 · 第十次作业
  • 原文地址:https://www.cnblogs.com/bigb/p/11779709.html
Copyright © 2020-2023  润新知