一、事务
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`
注意:导入数据前应确保目标已存在!