MySQL事务,视图,素引,备份和恢复。

事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。
事务 是指将一系列数据操作捆绑成为一 个整体进行统一管理。 如果某一事务执行成功,则在该事务中进行的所有数据更改均会提交。成为数据库中的永久组成部分。如果事务执行时遇到错误且必须取消或回滚,则数据将全部恢复到操作前的状态,所有数据的更改均被清除
事务是必须满足4个条件:

*原子性:*一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

*一致性:*在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

*隔离性:*数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化。

*持久性:*事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

  1. 用 BEGIN, ROLLBACK, COMMIT来实现
    BEGIN 开始一个事务
    ROLLBACK 事务回滚
    COMMIT 事务确认

  2. 直接用 SET 来改变 MySQL 的自动提交模式
    SET AUTOCOMMIT=0 禁止自动提交
    SET AUTOCOMMIT=1 开启自动提交

执行事务的语法:

  1. 开始事务:begin;或者start transaction;
  2. 提交事务:commit;
  3. 回滚(撤销)事务:rollback;

UNDO日志:复制事务执行前的数据,用于事务在发生异常时回滚数据。
REDO日志:记录事务在执行中,每条对数据库进行更新的操作,当事务被提交时,该内容将被刷新到磁盘。

使用事务要遵守的原则

  1. 事务尽可能简短。
  2. 事务中访问的数据量尽量最少。
  3. 查询数据时尽量不要使用事务。
  4. 在事务处理过程中尽量不要出现等待用户输入的操作。

视图

视图作用
数据库管理系统提供的视图这类数据库对象,可以把重复使用的复杂的查询结果保存成视图,也可以设定不同访问范围的视图,不同岗位的员工根据自己的权限来查看相关的数据,以保证数据访问的安全性。
视图
视图是另一种查看数据库中一个或多个表中的数据的方法,视图是一种虚拟表,通常作为一个或多个表的行或列的子集创建的。

视图通常用来进行的四项操作:

  1. 筛选表中的行
  2. 防止未经许可的用户访问敏感的数据表
  3. 将多个物理数据表抽象为一个逻辑数据表
  4. 降低数据的复杂程度

视图对用户的好处:
结果更加容易理解。创建视图时可以将列名改为更加有意义的列名,而不会影响物理的数据库数据。
获得数据更加容易。可以直接通过视图查看数据,不需要自己写查询语句。

视图对开发人员的好处:
限制数据检索更容易。可以有效的隐藏某些敏感数据
维护应用程序更方便。调试视图比调试查询更容易。

使用SQL语句创建视图
CREATE VIEW 视图名
AS
<SELECT 语句>;

使用SQL语句删除视图
DROP VIEW [IF EXISTS] 视图名;

使用SQL语句查看视图数据
SELECT 字段1,字段2……FROM view_name(视图名);

使用视图的注意事项

  1. 每个视图中可以使用多个表。
  2. 与查询相似,一个视图可以嵌套另一个视图,最好不要超过三层。
  3. 对视图数据进行添加,更新和删除操作直接引用表中的数据。
  4. 当视图数据来自多个表时,不允许添加和删除数据,会影响表中数据的完整性。

索引

索引是一种有效组合数据的方式,可以快速查找到指定的记录,类似与书籍中目录。
索引的作用

  1. 大大提高数据库的检索速度。
  2. 改善数据库的性能。

索引分类

  1. 普通索引:最基本索引类型,允许在定义索引的列中插入重复值和空值。它的唯一任务时加快对数据库的访问速度。因此,应该只为最常出现的查询条件或排序条件中数据列创建索引。
  2. 唯一索引:唯一索引不允许两行具有相同的索引值,允许有一个空值。若是创建了唯一约束,则将自动创建唯一索引。尽管唯一索引有助于找到信息,但是为了获得最佳的性能,仍建议使用主键约束。
  3. 主键索引:主键索引要求主键中的每个值都是非空的,唯一的,它允许快速访问数据。在数据关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。
  4. 复合索引:将多个列合并作为索引,这种索引称为复合索引。
    需要注意的是:只有在查询中使用了复合索引最左边的字段时,索引才会被使用,即第一个字段作为前缀的集合。
  5. 全文索引:全文索引的作用是支持值的查找,允许出现空值和重复值。全文索引可以在CHAR,VARCHAR或者TEXT类型的列上创建,全文索引的效率大大高于”LIKE”关键字。MySQL5.5中只有MyISAM存储引擎支持全文索引。
  6. 空间索引:空间索引是对空间数据类型的列建立的索引,如GEOMETRY,POINT等,创建空间索引列必须将其声明为NOT NULL,
    MySQL5.5中只有MyISAM存储引擎支持空间索引。

创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
ON table_name (column_name[length]……………);

UNIQUE 表示唯一索引,FULLTEXT 表示全文索引, SPATIAL表示空间索引,为可选参数。 Index_name表示索引名;
Table_name表示创建索引的表名; Column_name指定需要创建索引的列;
Length指定索引的长度,可选参数,只有字符串类型才能指定索引的长度。

删除索引
DROP INDEX index_name ON table_name;

查看索引
SHOW INDEX FROM table_name;

备份和恢复

使用mysqldump命令备份数据库
Mysqldump –u username –h host -ppassword
dbname[tbname1,tabnem2….]>filename.sql

使用mysql命令恢复数据库
mysql –u username -p [dbname]<filename.sql;
数据表导出到文本文件
SELECT columnlist FROM tablename
[WHERE contion ]
INTO OUTFILE filename [OPTION];

文本文件倒入到数据表
LOAD DATA INFILE filename INTO TABLE tablename[OPTION];

USE myschools;
CREATE TABLE  historyResult(
SELECT r.* FROM result r
INNER JOIN subjects s ON s.subjectno=r.subjectno
INNER JOIN grade g ON g.gradeId=g.gradeId
WHERE g.gradeName='一年级');
CREATE TABLE historeResult(
SELECT result.*  
FROM result INNER JOIN stuinfo ON result.`studentNo`=stuinfo.`studentNo`
INNER JOIN grade ON grade.`gradeId`=stuinfo.`gradeId` 
WHERE gradeName='一年级'
);
CREATE TABLE historStudent(
SELECT s.* FROM stuinfo s
INNER JOIN grade g ON s.`gradeId`=g.gradeId
WHERE gradeName='一年级'
);
# 查询成绩表中考试成绩最高分的学员
SELECT studentName FROM stuinfo s
INNER JOIN result r ON r.`studentNo`=s.`studentNo`
WHERE r.studentResult= (SELECT MAX(studentResult) FROM result); 
# 创建视图
CREATE VIEW vw_stuResult
AS SELECT s.studentName,r.studentResult  FROM stuinfo s ,result r
WHERE s.studentNo=r.studentNo
SELECT * FROM vw_stuResult;
#
CREATE VIEW vw_stucj
AS SELECT s.studentName,su.subjectname, AVG(r.studentResult) FROM stuinfo s 
INNER JOIN result r ON s.studentNo=r.studentNo
INNER JOIN subjects su ON r.subjectno=su.subjectno
GROUP BY s.studentNo;
SELECT * FROM vw_stucj;
#
SELECT * FROM result 
WHERE subjectno =(
SELECT subjectno FROM subjects
WHERE subjectname='语文')
INTO OUTFILE 'd:/mysql/result_Java.txt';
#
LOAD DATA INFILE'd:/mysql/result_Java.txt'INTO TABLE result;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~plus~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值