MySQL数据库 第四章

事务、视图、索引、备份和恢复

一.事物

1.定义:MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作

多个操作作为一个整体向系统提交,要么都执行,要么都不执行

事务是一个不可分割的工作逻辑单元

在MySQL中只有使用了Innobd数据库引擎的数据库或表才支持事务

失误用来管理insert,update,delete语句

2.事务必须具备以下四个属性,简称ACID属性

ACID属性解释原子性(Atomicity)事务是一个完整的操作,事物的各步操作是不可分的(原子的),要么都执行,要么都不执行一致性(Consistency)当事务完成时,数据必须处于一致状态隔离性(Isonlation)并发事务之间彼此隔离,它不应以任何方式依赖于或影响其他事务持久性(Durability)事务完成后,它对数据库的修改被永久保持

  1. 原子性(Atomicity)事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行
  2. 一致性(Consistency)当事务完成时,数据必须处于一致状态
  3. 隔离性(Isolation)并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务
  4. 持久性(Durability)事务完成后,它对数据库的修改被永久保持

3.事物控制语句

  1. BEGIN或START TRANSACTION; 显式 开启一个事务;
  2. COMMIT;COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
  3. ROLLBACK;回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  4. SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
  5. RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  6. ROLLBACK TO identifier;把事务回滚到标记点;
  7. SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED.READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

4.MySQL事务处理主要有两种方法:

<1>用BEGIN,ROLLBACK,COMMIT来实现
BEGIN开始一个事务
ROLLBACK事务回滚
COMMIT 事务确认
<2>直接用SET 来改变MySQL的自动提交模式
默认情况下,每条单独的SQL语句是为一个事务
关闭默认提交状态后,可手动开启 关闭事务
SET AUTOCOMMIT-0禁止自动提交
SET WUTOCOMMIT-1开启自动
关闭自动提交后,从下一条SQL语句开始则开启新事务,需使用COMMIT或ROLLBACK语句结束该事务

练习:

模拟实现转账

<1>先创建表添加数据

假定张三的账户1000元,李四账户有1元

CREATE TABLE `bank`  
(  
    `customerName` CHAR(10), #用户名     
    `currentMoney` DECIMAL(10,2)  #当前余额       
);  
/*插入数据*/  
INSERT INTO `bank`(`customerName`,`currentMoney`)   
     VALUES('张三',1000);  
INSERT INTO `bank`(`customerName`,`currentMoney`) VALUES('李四',1);

<2>从张三的账户转账500元到李四的账户

#张三的账户减500元,李四的账户增500元  
UPDATE `bank` SET `currentMoney`=`currentMoney`-500   
     WHERE `customerName`='张三';  
UPDATE `bank` SET `currentMoney`=`currentMoney`+500   
     WHERE `customerName`='李四';

执行命令得
这里写图片描述
<3>.转账过程就是一个整体
它需要两条UPDATE语句来完成,这两条语句是一个政体,如果其中一条出现错误,则整个转账业务也应该取消,两个账户中的余额应恢复到原来的数据,从而确保转账钱和转账后的月不变.
使用事务解决转账问题

BEGIN;  

    UPDATE `bank` SET currentMoney=currentMoney+500 WHERE customerName='张三';  
    UPDATE `bank` SET currentMoney=currentMoney-500 WHERE customerName='李四';  

ROLLBACK;#回滚事务,数据恢复到原始状态  

COMMIT;

<4>添加关闭自动提交和开启自动提交

SET autocommit=0;#关闭自动提交,以下视为一个事务  
/*--转账:张三的账户减少500元,李四的账户增加500元--*/  
UPDATE `bank` SET `currentMoney`=`currentMoney`-500   
     WHERE `customerName`='张三';  
UPDATE `bank` SET `currentMoney`=`currentMoney`+500   
     WHERE `customerName`='李四';  
COMMIT;#提交事务  
UPDATE `bank` SET `currentMoney`=`currentMoney`-1000 WHERE `customerName`='张三';  
ROLLBACK;#回滚事务  
SET autocommit = 1;#开启自动提交,恢复默认状态 

执行命令得
这里写图片描述

二.视图

1.什么是视图?

视图是一张虚拟表
表示一张表的部分数据或多张表的综合数据
其结构和数据是建立在对标的查询基础上
视图中不存放数据
数据存放在试图所引用的原始表中
一个原始表,根据不同用户的不同需求,可以创建不同的视图

2.用途?

  1. 防止未经许可的用户访问敏感数据
  2. 降低数据库的复杂程度
  3. 将多个物理数据库抽象为一个逻辑数据库
  4. 筛选表中的行

3.创建视图

<1>使用SQL语句创建视图
语法:DROP VIEW IF EXISTS 视图名;

DROP VIEW IF EXISTS vw_grad1_sexMale;#如果此视图存在就删除  
CREATE VIEW vw_grade1_sexMale#创建视图  
AS   
SELECT * FROM student  
WHERE gradeid=1 AND sex='男'#条件 一班 男性  

SELECT * FROM vw_grade1_sexMale#查询视图

4.视图的注意事项

  1. 视图中可以使用多个表
  2. 一个视图可以嵌套另一个视图
  3. 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据
  4. 当视图数据来自多个表时,不允许添加和删除数据
  5. 查看所有视图
    语法:USE 数据库
    SELECT * FROM views\G;
    在cmd中加上G有利于查看,在SQL.yog里不需要
    (使用视图修改数据会有许多限制,一般在实际开发中试图仅用作查询)
    例:使用视图获取多表中数据,统计每个学生所参考课程的平均成绩
CREATE VIEW view_student_result#创建视图  
AS  
SELECT studentName,sub.subjectName,AVG(studentresult)  
FROM student AS s  
INNER JOIN result AS r ON s.studentNo=r.studentNo  
INNER JOIN `subject` AS sub ON sub.subjectNo=r.subjectNo#三表匹配关系列  
GROUP BY studentName,subjectName#按照姓名 科目分组  

SELECT * FROM `view_student_result

三、索引

1.MySQL索引的建立于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度索引是一种有效组合数据的方式,为快速查找到指定记录

作用:大大提高数据库的检索速度,;改善数据库性能

2.MySQL索引按存储类型分类

B-树索引:InnoDB MyISAM均支持
哈希索引

  1. 普通索引,基本索引类型允许在定义索引的列中插入重复值金和空值
  2. 唯一索引,索引列数据不重复
  3. 主键索引,主键列中的每个值是非空唯一的 一个主键将自动创建主键索引
  4. 复合索引,将多个列组合作为索引
  5. 全文索引,支持值的全文查找 允许重复值和空值
  6. 空间索引,对空间数据类型的列创建索引

3.创建 删除索引

创建索引:
语法:CREATE [UNIQUE|FULLTEXT|SPATIAL] INDES index_name
ON table_name(column[length]…)
删除索引:
语法: DROP INDEX index_name ON table_name;
(删除表时,该表的所有索引同时会被删除)
例:在student表的studentName列创建普通索引

CREATE UNIQUE INDEX ix_stuName_unique  
ON student(studentName

使用视图多表连查

SELECT r.*  
FROM result AS r  
INNER JOIN `vw_grade1_sexmale` AS g ON g.studentNo=r.studentNo  

4.创建索引的指导原则

按照下列标准选择创立索引的列

  1. 频繁搜索的列(select 语句)
  2. 经常用作查询选择的列(select语句)
  3. 经常排序 分组的列(order by / group by)
  4. 经常用作连接的列(inner join 语句)
    请不要使用下面的列创建索引

    . 仅包含几个不同值的列
    . 表中仅包含几行

5.使用索引时注意事项

  1. 查询时减少使用*返回全部列,不要返回不需要的列
  2. 索引应该尽量小,在字节数小的列上建立索引
  3. WHERE字句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前
  4. 比表ORDER BY子句中使用表达式

6.查看索引

语法:SHOW INDEX FROM table_name;
例;查看python7数据库中全部索引信息

USE python7;  
SHOW INDEX FROM student;

执行命令得
这里写图片描述
Table:创建索引的表
Non_unique:索引是否非唯一
Key_name:索引的名称
Column_name:定义索引的列字段
Seq_in_index:该列在索引中的位置
Null:该列是否能为空值
Index_type:索引类型

四、备份数据库

1.为什么进行数据库备份
数据库故障 突然断电 病毒入侵 误操作导致数据丢失….
2.备份数据库

1.mysqldunmp命令—MySQL一个常用的备份工具

将CREATE和INSERTINTO语句保存到文本文件.属于DOS命令
语法:
这里写图片描述
(注意: mysqldump是DOS系统下的命令,在使用时无需进入mysql命令行,否则将无法执行)
示例:使用root账户登录到MySQL服务器,备份python7数据库下的student
这里写图片描述
(注意:为保证账户密码安全,命令中可不写密码,但参数”-p”必须写,回车后根据提示写密码)

2.常用参数选项

这里写图片描述

3.备份文件包含的主要信息

<1>备份后文件包含信息MySQL及mysql工具版本号

<2>备份账户的名称

<3>主机信息

<4>备份的数据库名称

<5>SQL语句注释和服务器相关注释

<6>CREQTE 和 INSERT 语句

五、恢复数据库

1.使用mysql命令恢复数据库

语法:
这里写图片描述
(注意:<1>mysql为DOS命令<2>在执行该语句之前,必须在MySQL服务器中创建新的数据库,如果不存在恢复数据库活成将会出错)
示例:使用备份文件将python7数据库中的student表信息恢复到python8数据库中
这里写图片描述

2.使用source命令恢复数据库

语法: source filname;

注意:登录MySQL服务后使用 执行该命令前,先创建并选择恢复后的目标数据库

CREATE DATABASE python8;#创建数据库  
USE python8;#选择数据库  
source d:\python项目\student_info.sql#恢复数据库

3.通过复制文件实现数据备份和恢复

<1>直接赋值MySQL数据库的储存目录及文件进行备份
优点:操作简单

缺点:复制数据前停止服务
不适合InnoDS数据库
MySQL版本不同步兼容

注意:此方法不是最优的数据库备份和恢复方案
<2>表数据导出到文本文件
SELECT * FROM table_name
WHERE contion
INTO OUTFILE “导出的目标文件” [OPTION]
示例:
将试图vw_grade1_sexmale中的信息导出到文本文件

SELECT studentNO FROM  `vw_grade1_sexmale`)  
INTO OUTFILE 'D:/python项目/exam1.txt'

导入:
语法:

LOAD DATA INFILE ‘目标文件’ INTO TABLE
示例:

将数据从文本文件导入到python7的student表

LOAD DATA INFILE 'D:/Pictures/exam1.txt'  
INTO TABLE `student`

注意:导入数据前应确保目标已存在!

猜你喜欢

转载自blog.csdn.net/weixin_42067855/article/details/80781082