事务、视图、索引、备份和恢复
一.事物
1.定义:MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
多个操作作为一个整体向系统提交,要么都执行,要么都不执行
事务是一个不可分割的工作逻辑单元
在MySQL中只有使用了Innobd数据库引擎的数据库或表才支持事务
失误用来管理insert,update,delete语句
2.事务必须具备以下四个属性,简称ACID属性
ACID属性解释原子性(Atomicity)事务是一个完整的操作,事物的各步操作是不可分的(原子的),要么都执行,要么都不执行一致性(Consistency)当事务完成时,数据必须处于一致状态隔离性(Isonlation)并发事务之间彼此隔离,它不应以任何方式依赖于或影响其他事务持久性(Durability)事务完成后,它对数据库的修改被永久保持
- 原子性(Atomicity)事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行
- 一致性(Consistency)当事务完成时,数据必须处于一致状态
- 隔离性(Isolation)并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务
- 持久性(Durability)事务完成后,它对数据库的修改被永久保持
3.事物控制语句
- BEGIN或START TRANSACTION; 显式 开启一个事务;
- COMMIT;COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
- ROLLBACK;回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
- 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;
<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.用途?
- 防止未经许可的用户访问敏感数据
- 降低数据库的复杂程度
- 将多个物理数据库抽象为一个逻辑数据库
- 筛选表中的行
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.视图的注意事项
- 视图中可以使用多个表
- 一个视图可以嵌套另一个视图
- 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据
- 当视图数据来自多个表时,不允许添加和删除数据
- 查看所有视图
语法: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均支持
哈希索引
- 普通索引,基本索引类型允许在定义索引的列中插入重复值金和空值
- 唯一索引,索引列数据不重复
- 主键索引,主键列中的每个值是非空唯一的 一个主键将自动创建主键索引
- 复合索引,将多个列组合作为索引
- 全文索引,支持值的全文查找 允许重复值和空值
- 空间索引,对空间数据类型的列创建索引
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.创建索引的指导原则
按照下列标准选择创立索引的列
- 频繁搜索的列(select 语句)
- 经常用作查询选择的列(select语句)
- 经常排序 分组的列(order by / group by)
经常用作连接的列(inner join 语句)
请不要使用下面的列创建索引. 仅包含几个不同值的列
. 表中仅包含几行
5.使用索引时注意事项
- 查询时减少使用*返回全部列,不要返回不需要的列
- 索引应该尽量小,在字节数小的列上建立索引
- WHERE字句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前
- 比表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`
注意:导入数据前应确保目标已存在!