5.事务、视图、索引、备份和恢复
- 回顾上次知识
下列语句实现了什么功能?
SELECT * FROM student
WHERE EXISTS(
SELECT *FROM result
WHERE studentno=student.studentno );
实现了---查询参加考试的学生!
能否使用IN 子查询改写上述语句?
SELECT * FROM `student`
WHERE `studentNo` IN (SELECT `studentNo` FROM `result`);
请使用连接查询改写上述语句:
SELECT * FROM `student` INNER JOIN `result`
ON `student`.`studentNo` = `result`.`studentNo`;
-
本章任务
- 批量插入学生考试成绩
- 办理毕业学生离校手续
- 查看学生各科目考试成绩平均分
- 创建学生表和成绩表索引并查看索引
- myschool数据库的备份和恢复
- 科目表数据的导出和导入
-
本章目标
- 使用事务保证操纵数据的完整性
- 掌握如何创建并使用视图
- 掌握如何创建并使用索引
- 掌握如何进行数据库的备份和恢复
-
什么是事务?
- 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
- 多个操作作为一个整体向系统提交,要么都执行、要么都不执行
- 事务是一个不可分割的工作逻辑单元
注意:
转账过程就是一个整体
它需要两条UPDATE语句来完成,这两条语句是一个整体
如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是1001元。
- 事务的特性
事务必须具备以下四个属性,ACID属性!
-
- 原子性(Atomicity)
事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行
-
- 一致性(Consistency)
当事务完成时,数据必须处于一致状态
-
- 隔离性(Isolation)
并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务
-
- 持久性(Durability)
事务完成后,它对数据库的修改被永久保持
- 如何创建事务
MySQL中支持事务的存储引擎有InnoDB和BDB
语法:
开始事务
BEGIN ;
或
START TRANSACTION;
提交事务
COMMIT ;
回滚(撤销)事务
ROLLBACK ;
- 使用事务解决银行转账问题3-1
实战示例:
情况一:转账成功
从张三的账户转出500元,存入李四的账户中
BEGIN; ----开始事务(指定事务从此处开始,后续的SQL语句都是一个整体)
/*--转账:张三的账户减少500元,李四的账户增加500元--*/
UPDATE `bank` SET `currentMoney`=`currentMoney`-500
WHERE `customerName`='张三';
UPDATE `bank` SET `currentMoney`=`currentMoney`+500
WHERE `customerName`='李四';
COMMIT; ----提交事务,事务结果
COMMIT:是自动保存事务,如果没有执行,则只是保存临时文件,其他重新打开的文件不可见。
情况二:转账失败,钱全部退还
BEGIN;
UPDATE `bank` SET `currentMoney`=`currentMoney`-1000 WHERE `customerName`='张三';
ROLLBACK; ---回滚事务,数据恢复到原始状态
-
自动关闭和开启事务-1
- 默认情况下,每条单独的SQL语句视为一个事务
- 关闭默认提交状态后,可手动开启、关闭事务
语法:
关闭/开启自动提交状态
SET autocommit = 0|1;
-
-
- 值为0:关闭自动提交
- 值为1:开启自动提交
-
注意:
关闭自动提交后,从下一条SQL语句开始则开启新事务,需使用COMMIT或ROLLBACK语句结束该事务。
- 自动关闭和开启事务2-2
示例: -----关闭自动提交
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;-----开启自动 提交,恢复默认状态
-
为什么需要视图?
- 不同的人员关注不同的数据
- 保证信息的安全性
-
什么是视图
-
视图是一张虚拟表
- 表示一张表的部分数据或多张表的综合数据
- 其结构和数据是建立在对表的查询基础上
-
视图中不存放数据
- 数据存放在视图所引用的原始表中
- 一个原始表,根据不同用户的不同需求,可以创建不同的视图
-
视图是一张虚拟表
-
视图的用途
- 筛选表中的行
- 防止未经许可的用户访问敏感数据
- 降低数据库的复杂程度
- 将多个物理数据库抽象为一个逻辑数据库
- 如何创建视图2-1
语法:
使用SQL语句创建视图
CREATE VIEW view_name (myschool . banzhuren)
AS
<SELECT 语句>;
语法:
使用SQL语句删除视图
DROP VIEW [IF EXISTS] view_name;
[IF EXISTS] ---删除前,判断视图是否存在
语法:
使用SQL语句查看视图
SELECT 字段1, 字段2, …… FROM view_name;
- 如何创建视图--实战演习
示例:
创建方便教师查看成绩的视图
USE myschool;
DROP VIEW IF EXISTS `view_student_result`; --作用:删除视图
CREATE VIEW `view_student_result` --作用:创建视图
AS
……
SELECT * FROM `view_student_result`; --作用:查看视图
-
使用视图注意事项
- 视图中可以使用多个表
- 当视图数据来自多个表时,不允许添加和删除数据
- 一个视图可以嵌套另一个视图
- 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据
提示:
-
- 查看所有视图
USE information_schema ;
SELECT * FROM views\G ;
经验:
使用视图修改数据会有许多限制,一般在实际开发中视图仅用作查询
-
什么是索引-1?
- 汉语字典中的汉字按页存放,一般都有汉语拼音目录(索引)、偏旁部首目录等
- 我们可以根据拼音或偏旁部首,快速查找某个字词
- 什么是索引-2?
-
什么是索引-3
- 索引是一种有效组合数据的方式,为快速查找到指定记录
-
作用
- 大大提高数据库的检索速度
- 改善数据库性能
-
MySQL索引按存储类型分类
- B-树索引:InnoDB、MyISAM均支持
- 哈希索引
-
常用索引类型
- 普通索引-------基本索引类型
允许在定义索引的列中插入重复值和空值
-
- 唯一索引-------索引列数据不重复
允许有空值
-
- 主键索引-------主键列中的每个值是非空、唯一的
一个主键将自动创建主键索引
-
- 复合索引-------将多个列组合作为索引
- 全文索引-------支持值的全文查找
允许重复值和空值
-
- 空间索引-------对空间数据类型的列建立的索引
- 如何创建/删除索引-1
语法:
创建索引: 唯一索引、全文索引、空间索引--------可选
CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX index_name
ON table_name (column_name [length]…);
语法:
删除索引:
DROP INDEX index_name ON table_name;
注意:
删除表时,该表的所有索引同时会被删除
- 如何创建/删除索引--------实战演习
示例: ON ---根据
在student表的studentName列创建普通索引
USE myschool;
CREATE INDEX `index_student_studentName`
ON `student`(`studentName`);
-
创建索引的指导原则
- 按照下列标准选择建立索引的列
- 频繁搜索的列
- 经常用作查询选择的列
- 经常排序、分组的列
- 经常用作连接的列(主键/外键)
- 请不要使用下面的列创建索引
- 仅包含几个不同值的列
- 表中仅包含几行
- 小数据量的表建议不要加索引
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 按照下列标准选择建立索引的列
-
使用索引时注意事项
- 查询时减少使用*(返回全部列),不要返回不需要的列
- 索引应该尽量小,在字节数小的列上建立索引
- WHERE子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前
- 避免在ORDER BY子句中使用表达式
- 查看索引
语法: SHOW INDEX FROM table_name;
示例:
查看myschool数据库中全部索引信息:
USE myschool;
SHOW INDEX FROM `student`\G;
注释:
Table:创建索引的表
Non_unique:索引是否非唯一
Key_name:索引的名称
Column_name:定义索引的列字段
Seq_in_index:该列在索引中的位置
Null:该列是否能为空值
Index_type:索引类型
-
为什么进行数据库备份?
- 数据库故障
- 突然断电
- 病毒入侵
- 误操作导致数据丢失
- ……各种意外状况
- 使用mysqldump命令备份数据库-1
mysqldump命令——MySQL一个常用的备份工具
mysqldump 是和MySQL同级别的命令,可以直接在MySQL后面使用
将CREATE和INSERT INTO语句保存到文本文件
属于DOS命令
- 使用mysqldump命令备份数据库-2
示例:
使用root账户登录到MySQL服务器,备份myschool数据库下的student表
mysqldump –u root –p myschool student > d:\20160808.sql
注意:
为保证账户密码安全,命令中可不写密码,但参数“-p”必须有,回车后根据提示写密码。
- 使用mysqldump命令备份数据库-3
常用参数选项
参数 |
描述 |
-add-drop-table
|
在每个CREATE TABLE语句前添加DROP TABLE语句,默认是打开的,可以用-skip-add-drop-table来取消 |
--add-locks
|
该选项会在INSERT 语句中捆绑一个LOCK TABLE 和UNLOCK TABLE 语句 好处:防止记录被再次导入时,其他用户对表进行的操作 |
-t或-no-create-info
|
只导出数据,而不添加CREATE TABLE语句
|
-c或--complete-insert
|
在每个INSERT语句的列上加上列名,在数据导入另一个数据库时有用 |
-d或--no-data
|
不写表的任何行信息,只转储表的结构
|
-
备份文件包含的主要信息
-
- 备份后文件包含信息MySQL及mysqldump工具版本号
- 备份账户的名称
- 主机信息
- 备份的数据库名称
- SQL语句注释和服务器相关注释
- CREATE和INSERT语句
- 备份文件
-
- 恢复备份
恢复数据库-1 ---恢复之前,一定要先创建新数据库?
方法一:使用mysql命令恢复数据库
mysql –u username –p [dbname] < filename.sql
用户名 数据库名 备份文件名
注意:
1. mysql为DOS命令
2.在执行该语句之前,必须在MySQL服务器中创建新数据库,如果不存在恢复数据库过程将会出错
3. mysqldump --help|more 帮助你查看mysqldump统计的命令
或者,
使用mysqldump命令来实现:
恢复以及备份出去了的数据库(h:...),到新数据库里面(test)
#方法一:
mysql>USE test;
DATABASE CHANGED mysql >source h:/chenxuan/school.sql
#方法二:
mysql-uroot -pkgc test<脚本路径(h:/chenxuan/school.sql)
#将school数据库中,student表中的学号、姓名两列备份出去
USE school;
SELECT id,`name`
#注意:备份出去的文件不能提前存在,他会自动创建
INTO OUTFILE'h:/chenxuan/student.sql'
FROM account;
#将备份出去的数据恢复到test数据库的student表中来
USE test;
CREATE TABLE stutab(
id INT(4),
NAME VARCHAR(20)
)
LOAD DATA INFILE 'h:/chenxuan/student.sql' INTO TABLE stutab(id,sname);
SELECT * FROM stutab;
恢复数据库-2
方法二: ----使用SQLyog工具来备份和恢复
示例:
使用备份文件将myschool数据库中student表信息恢复到schoolDB数据库中
mysql –u root –p schoolDB < d:\20160808.sql
mysql>USE test;
mysql>source 脚本路径
mysql命令恢复
mysql -uroot -pkgc test<脚本路径
恢复数据库-3
方法三:使用source命令恢复数据库
语法: source filename;
注意:
登录MySQL服务后使用
执行该命令前,1.先创建并2.选择恢复后的目标数据库3.使用source命令
示例:
CREATE DATABASE myschoolDB2; #创建数据库
USE myschoolDB2; #选择数据库
source d:\20160808.sql; #恢复后的目标数据库导入到~~
注意:
备份过程中,打勾的选项看清楚,别影响恢复
- 通过复制文件实现数据备份和恢复
直接复制MySQL数据库的存储目录及文件进行备份
- 表数据导出到文本文件
导出/导入数据——可实现数据库服务器间移动数据
语法:
SELECT *
FROM tablename
[WHERE 条件]
INTO OUTFILE 'filename' [OPTION]
filename' ------------导出到的目标文件
将成绩表中“Logic Java”课程的成绩信息导出到文本文件
示例:
SELECT * FROM `result`
WHERE `subjectNo` =
(SELECT `subjectNo` FROM `subject`
WHERE `subjectName` = 'Logic Java')
INTO OUTFILE 'd:/Java.txt';
- 文本文件导入到数据表
语法:
LOAD DATA INFILE filename INTO TABLE tablename [OPTION]
将数据从文本文件导入到myschoolDB的result表
LOAD DATA INFILE 'd:/back/result_Java.txt' INTO TABLE result;
注意: 导入数据前应确保目标表已存在!
- 总结