MySQL数据库06(事务、视图、索引、备份和恢复)

一、事务

1.定义

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

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

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

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

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

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

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

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

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

隔离性(Isonlation)并发事务之间彼此隔离,它不应以任何方式依赖于或影响其他事务

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

3.事务控制语句

控制语句作用
BEGIN或START TRANSACTION;
显式 开启一个事务;
COMMIT;

也可以使用COMMIT WORK,不过二者是

等价的。COMMIT会提交事务,并使已对数

据库进行的所有修改称为永久性的;

ROLLBACK;

有可以使用ROLLBACK WORK,不过二者

是等价的。回滚会结束用户的事务,并撤销

正在进行的所有未提交的修改;

SAVEPOINT identifier;

SAVEPOINT允许在事务中创建一个保存点,

一个事务中可以有多个SAVEPOINT;

RELEASE SAVEPOINT identifier;

删除一个事务的保存点,当没有指定的保存点

时,执行该语句会抛出一个异常;

ROLLBACK TO identifier;
把事务回滚到标记点;
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;

假设中间出现问题 执行ROLLBAK命令 则回滚事务

<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语句创建视图

语法:CREATE VIEW view_name

AS

<SELECT语句>;

<2>使用SQL语句删除视图

语法:DROP VIEW IF EXISTS view_name;

<3>使用SQL语句查看视图

语法:SELECT 字段1,字段2...from view_name;

:创建班级为1且为男性的学生信息

 
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;

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

例:使用视图获取多表中数据,统计每个学生所参考课程的平均成绩

 
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均支持

    哈希索引

常用索引

类型说明
普通索引

基本索引类型

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

唯一索引索引列数据不重复
主键索引

主键列中的每个值是非空 唯一的

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

复合索引将多个列组合作为索引
全文索引

支持值的全文查找

允许重复值和空值

空间索引对空间数据类型的列创建的索引

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 语句)

请不要使用下面的列创建索引

<1>仅包含几个不同值的列

<2>表中仅包含几行

5.使用索引时注意事项

<1>查询时减少使用*返回全部列,不要返回不需要的列

<2>索引应该尽量小,在字节数小的列上建立索引

<3>WHERE字句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前

<4>比表ORDER BY子句中使用表达式

6.查看索引

语法:SHOW INDEX FROM table_name;

例;查看python7数据库中全部索引信息

 
USE python7;
SHOW INDEX FROM student\G;

执行命令得


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

 
mysqldump -u root -p python7 student > d:python项目\student_info.sql

(注意:为保证账户密码安全,命令中可不写密码,但参数"-p"必须写,回车后根据提示写密码)

2.常用参数选项

参数描述
-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
不写表的任何行信息,只转储表的结构

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 

table_name[OPTION]

示例:

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

 
LOAD DATA INFILE 'D:/Pictures/exam1.txt'
INTO TABLE `student`
注意:导入数据前应确保目标已存在!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章