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

  1. 回顾上次知识

下列语句实现了什么功能?

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

  1. 本章任务
    1. 批量插入学生考试成绩
    2. 办理毕业学生离校手续
    3. 查看学生各科目考试成绩平均分
    4. 创建学生表和成绩表索引并查看索引
    5. myschool数据库的备份和恢复
    6. 科目表数据的导出和导入
  2. 本章目标
    1. 使用事务保证操纵数据的完整性
    2. 掌握如何创建并使用视图
    3. 掌握如何创建并使用索引
    4. 掌握如何进行数据库的备份和恢复
  3. 什么是事务?
    1. 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
    2. 多个操作作为一个整体向系统提交,要么都执行、要么都不执行
    3. 事务是一个不可分割的工作逻辑单元

注意:

转账过程就是一个整体

它需要两条UPDATE语句来完成,这两条语句是一个整体

如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是1001元。

  1. 事务的特性

事务必须具备以下四个属性,ACID属性!

    1. 原子性(Atomicity)

事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行

    1. 一致性(Consistency)

当事务完成时,数据必须处于一致状态

    1. 隔离性(Isolation)

并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务

    1. 持久性(Durability)

事务完成后,它对数据库的修改被永久保持

  1. 如何创建事务

MySQL中支持事务的存储引擎有InnoDBBDB

语法:

开始事务

BEGIN ;

START TRANSACTION;

提交事务

COMMIT ;

回滚(撤销)事务

ROLLBACK ;

  1. 使用事务解决银行转账问题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. 自动关闭和开启事务-1
    1. 默认情况下,每条单独的SQL语句视为一个事务
    2. 关闭默认提交状态后,可手动开启、关闭事务

语法:

关闭/开启自动提交状态

 SET autocommit = 0|1;

      • 值为0:关闭自动提交
      • 值为1:开启自动提交

注意:

关闭自动提交后,从下一条SQL语句开始则开启新事务,需使用COMMITROLLBACK语句结束该事务。

  1. 自动关闭和开启事务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;-----开启自动 提交,恢复默认状态

  1. 为什么需要视图?
    1. 不同的人员关注不同的数据
    2. 保证信息的安全性

  1. 什么是视图
    1. 视图是一张虚拟表
      • 表示一张表的部分数据或多张表的综合数据
      • 其结构和数据是建立在对表的查询基础上
    2. 视图中不存放数据
      • 数据存放在视图所引用的原始表中
    3. 一个原始表,根据不同用户的不同需求,可以创建不同的视图
  2. 视图的用途
    1. 筛选表中的行
    2. 防止未经许可的用户访问敏感数据
    3. 降低数据库的复杂程度
    4. 将多个物理数据库抽象为一个逻辑数据库
  3. 如何创建视图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;

  1. 如何创建视图--实战演习

示例:

创建方便教师查看成绩的视图

USE myschool;

DROP VIEW IF EXISTS `view_student_result`;   --作用:删除视图

CREATE VIEW `view_student_result`       --作用:创建视图

AS

   ……

SELECT * FROM `view_student_result`; --作用:查看视图

  1. 使用视图注意事项
    1. 视图中可以使用多个表
    2. 当视图数据来自多个表时,不允许添加和删除数据
    3. 一个视图可以嵌套另一个视图
    4. 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据

提示:

    1. 查看所有视图

USE information_schema ;

SELECT * FROM views\G ;

经验:

使用视图修改数据会有许多限制,一般在实际开发中视图仅用作查询

  1. 什么是索引-1?
    1. 汉语字典中的汉字按存放,一般都有汉语拼音目录(索引)、偏旁部首目录等
    2. 我们可以根据拼音或偏旁部首,快速查找某个字词
  2. 什么是索引-2?

  

  1. 什么是索引-3
    1. 索引是一种有效组合数据的方式,为快速查找到指定记录
    2. 作用
      • 大大提高数据库的检索速度
      • 改善数据库性能
    3. MySQL索引按存储类型分类
      • B-树索引:InnoDB、MyISAM均支持
      • 哈希索引
  2. 常用索引类型
    1. 普通索引-------基本索引类型

允许在定义索引的列中插入重复值空值

    1. 唯一索引-------索引列数据不重复

允许有空值

    1. 主键索引-------主键列中的每个值是非空、唯一的

一个主键将自动创建主键索引

    1. 复合索引-------将多个列组合作为索引
    2. 全文索引-------支持值的全文查找

允许重复值和空值

    1. 空间索引-------对空间数据类型的列建立的索引
  1. 如何创建/删除索引-1

语法:

创建索引: 唯一索引、全文索引、空间索引--------可选

CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX  index_name

       ON  table_name (column_name [length]…);

语法:

删除索引:

DROP  INDEX index_name ON table_name;

注意:

删除表时,该表的所有索引同时会被删除

  1. 如何创建/删除索引--------实战演习

示例:  ON ---根据

在student表的studentName列创建普通索引

USE myschool;

CREATE  INDEX  `index_student_studentName`

   ON  `student`(`studentName`);

  1. 创建索引的指导原则
    1. 按照下列标准选择建立索引的列
      • 频繁搜索的列
      • 经常用作查询选择的列
      • 经常排序分组的列
      • 经常用作连接的列(主键/外键)
    2. 请不要使用下面的列创建索引
      • 仅包含几个不同值的列
      • 表中仅包含几行
      • 小数据量的表建议不要加索引
      • 索引不是越多越好
      • 不要对经常变动的数据加索引

 

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

语法: 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:索引类型

  1. 为什么进行数据库备份?
    1. 数据库故障
    2. 突然断电
    3. 病毒入侵
    4. 误操作导致数据丢失
    5. ……各种意外状况
  2. 使用mysqldump命令备份数据库-1

mysqldump命令——MySQL一个常用的备份工具

mysqldump 是和MySQL同级别的命令,可以直接在MySQL后面使用

将CREATE和INSERT INTO语句保存到文本文件

属于DOS命令

  1. 使用mysqldump命令备份数据库-2

示例:

使用root账户登录到MySQL服务器,备份myschool数据库下的student表

mysqldump –u root –p myschool student > d:\20160808.sql

注意:

为保证账户密码安全,命令中可不写密码,但参数“-p”必须有,回车后根据提示写密码。

  1. 使用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

 

不写表的任何行信息,只转储表的结构

 

  1.  备份文件包含的主要信息
      • 备份后文件包含信息MySQL及mysqldump工具版本号
      • 备份账户的名称
      • 主机信息
      • 备份的数据库名称
      • SQL语句注释和服务器相关注释
      • CREATE和INSERT语句
      • 备份文件
  2. 恢复备份

恢复数据库-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; #恢复后的目标数据库导入到~~

注意:

备份过程中,打勾的选项看清楚,别影响恢复

 

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

直接复制MySQL数据库的存储目录及文件进行备份

  1. 表数据导出到文本文件

导出/导入数据——可实现数据库服务器间移动数据

语法:

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

  1. 文本文件导入到数据表

语法:

 LOAD DATA  INFILE filename INTO TABLE tablename [OPTION]

将数据从文本文件导入到myschoolDB的result表

LOAD DATA INFILE 'd:/back/result_Java.txt' INTO TABLE result;

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

  1. 总结

 

 

发布了65 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/kxindouhao5491/article/details/82857965
今日推荐