MySQL见闻录 - 入门之旅(三)

时间:2022-07-23
本文章向大家介绍MySQL见闻录 - 入门之旅(三),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在网上翻来覆去找不到一套适合新手自学的书,于是买了课,急急忙忙上完了课,又发现全还给老师了。 这一系列文放在这里,从下载软件开始,记录一条MySQL入门之旅。 新手也可以跟着这条路走,一条道走到黑。 粉丝可见,愿者上钩。 有任何疑问,参考三篇上课笔记,或者私信我。

1、获取数据库里的元数据

前面讲的杂乱无章,整理一下:

 show databases;
 show create database sampdb;	//建库语句查询
 show tables;
 show create table score;	//建表语句查询
 show columns from student;
 show index from student;
 show table status;		//查看数据表的描述性信息

2、使用视图

视图是一种虚表,它是从数据表或其他视图中抽取出数据形成的临时表,用来提供查看数据的另一种方式,可以简化应用程序。

创建视图:

create view view_name as
select column1,column2... from table_name;

查询视图的方法和效果与普通数据表一样,使用视图时,你只能引用当前视图中存在的数据列。

视图可以用来自动完成必要的数学运算,我们可以把视图运算放在一个视图定义里运行。

3、事务处理

事务是作为一个不可分割的逻辑单元而被执行的一组SQL语句,如有必要,它们的执行效果可以被撤销。 并非所有的语句每次都能被执行成功。 事务的处理是通过提交和回滚功能实现的。如果某个事务里的语句都执行完成了,提交该事务将把那些执行效果永久的记录到数据库里。如果在事务过程中发生错误,回滚该事务将把发生错误之前已经执行的语句全部撤销。

事务的另一个用途就是确保某个操作所设计的数据行在你正在使用它们的时候不会被其他客户所修改。 MySQL在执行每一条SQL语句时都会自动的对该语句所设计的资源进行锁定以避免个语句之间相互干扰,但这仍不足以保证每一个数据库操作总是能得到预期的结果。要知道,有的数据库操作需要多条语句才能完成,而在此期间,不同的客户就有可能互相干扰。 通过把多条语句组合成一个执行单元,事务机制可以防止多客户环境里可能发生的并发问题。

使用事务处理为数据库提供了强有力的保证,但这需要增加CPU、内存和硬盘空间等方面的开销作为代价。 想要使用事务,就必须选择一个支持事务的存储引擎,如innoDB。

要注意,有些语句时不能成为事务的一部分的,所以在事务中出现了这些语句,系统会自动将事务提交,如:

ALTER TABLE

CREATEINDEX

DROP DATABASE

DROP INDEX

DROP TABLE

LOCK TABLES

RENAME TABLE

SET autocommit = 1 (if not already set to 1)

每个版本的情况略有偏差,具体还得看官方文档。

4、使用事务保存点

MySQL使你能够对一个事务进行部分回滚,这就需要你在事务过程中使用savepoint语句设置一些称为”保存点“的标记。在后续的事务里,如果你想回滚到某个特定的保存点,在rollback语句里给出该保存点的位置即可。

有图有真相:

5、外键使用

利用外键(foreign key)关系可以在某个数据表里声明与另一个数据表里的某个索引相关联的索引。还可以把你想施加在数据表上的约束条件放到外键关系里,让系统根据这个关系里的规则来维护数据的引用完整性。比如说,sampdb 数据库里的score数据表包含-一个student_ id 数据列,我们要用它把score数据表里的考试成绩与student数据表里的学生联系在-起。当我们在第1章里创建这些数据表时,我们在它们之间建立了一些明确的关系,其中之一-是把score. student_ id数据列定义为student. student_ id数据列的-一个外键。这可以确保只有那些在studnt数据表里存在student_ id值的数据行才能被插人到score数据表里。换句话说,这个外键可以确保不会出现为一名并不存在的学生输入了成绩的错误。

外键不仅在数据行的插人操作中很有用,在删除和更新操作中也很有用。比如说,我们可以建立这样-一个约束条件:在把某个学生从student数据表里删除时,score 数据表里与这个学生有关的所有数据行也将自动被删除。这被称为级联删除(cascaded delete), 因为删除操作的效果就像瀑布(cascade)那样从一一个数据表“流淌”到另外-一个数据表。级联更新也是可能的。比如说,如果利用瀑布式更新在student数据表里改变了某个学生的student_ id, score 数据表里与这个学生相对应的所有数据行的这个值也应该发生相应的改变。

外键可以帮我们维护数据的一致性,它们用起来也很方便。如果不使用外键,就必须由你来负责保证数据表之间的依赖关系和维护它们的致性,而这意味着你的应用程序必须增加一-些必要的代码。在某些情况下,这只需要你额外发出几条DELETE语句以确保当你删除某个数据表里的数据行时,其他数据表里与之相对应的数据行也将随之一起被删除。但额外工作毕竟是额外工作,而且既然数据库引擎能够替你进行数据一致性检查,为什么不让它干呢?要是你的数据表有非常复杂的关系,由你在你的应用程序里通过代码去检查这些依赖关系就会变得很麻烦,而数据库系统提供的自动检查能力往往要比你本人考虑得更周全和更细致,也更简明实用。

示例: