在MySQL中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段(注:在Oracle中并非如此)
主键约束:primary key(简称PK)
主键值是每一行记录的唯一标识
,相当于人类的“身份证号”
任何一张表都应该有主键,没有主键的表是无效的
主键的特征:not null+unique[主键值不能是null,同时也不能重复]
单一主键
给表添加主键约束:
使用列级添加主键约束:
使用表级添加主键约束:
复合主键
在实际开发中,不建议使用复合主键,因为本身主键存在的意义就是作为某条记录的唯一标识,单一主键能够达到该效果
列级主键约束只能添加一个:
主键值的类型建议使用:int,bigint,char等类型,不建议使用:varchar来做主键,主键值一般都是数字,是定长的
对于主键的类型,除了我们上文提到的单一主键和复合主键之外,我们还可以将主键分为自然主键和业务主键。
自然主键:主键值是一个自然数,和业务没有关系
业务主键:主键值和业务密切相关,例如:拿银行卡账号做主键
在实际开发中,自然主键使用的会比较多一些,因为主键只要做到不重复就行,不需要有意义,业务主键不太好,因为主键一旦和业务挂钩,那么当业务发生变动时,可能会影响主键的值,所以业务主键不是我们所推荐的
主键自增机制:
外键约束:foreign key(简称FK)
业务背景:请设计数据库表,来描述"班级和学生"的信息
第一种方案:班级和学生存储在一张表中
这种存储数据的缺点是:数据冗余,空间浪费
第二种方案:班级一张表,学生一张表
当t_student表中的cno字段没有任何约束的时候,可能会导致数据无效,会出现除了t_class表中,当前存在的100/101以外的其他数字,所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束,那么cno字段就是外键字段,cno字段中的每一个值都是外键值。
t_class是父表,t_student是子表:
删除表的顺序:先删子表,再删父表
若先删除父表,那么子表将会受到影响,因为它参照了父表中的很多数据
创建表的顺序:先创建父表,再创建子表
父表中的某些数据是子表建立的基础,因此,需要先建立父表
删除数据的顺序:先删除子表,再删除父表
如果先删除父表,那么子表将会不完整,因为它还在使用父表的数据
插入数据的顺序:先插入父表,再插入子表
子表需要使用父表的数据,因此没有父表,子表中的数据就是不完整的
举例:
子表中的外键引用的父表中的某个字段,被引用的这个字段不要求必须是主键,但是必须具有唯一性
子表中的外键是可以为空的
检查约束:check(MySQL不支持,Oracle支持)
存储引擎的使用:
存储引擎
是MySQL中特有的一个术语,其他数据库中没有(Oracle中有,但是并不叫存储引擎),它实际上是一个表存储/组织数据的方式,不同的存储引擎,表存储数据的方式不同
数据库中的各表均被[在创建表时]指定的存储引擎来处理,服务器可用的引擎依赖于以下因素:
MySQL的版本 服务器在开发时如何被配置 启动选项
为了解当前服务器中有哪些存储引擎可用,可使用show engines
命令
在建表时,指定引擎:
使用show create table 表名
命令,可查看该表的结构数据:
MySQL默认的存储引擎是:InnoDB
MySQL默认的字符编码方式是:utf8
在建表时,设置存储引擎和字符编码方式:
查看当前MySQL支持的引擎有哪些:
查看当前的MySQL版本:
MyISAM存储引擎是MySQL最常用的引擎
它管理的表具有以下特征:
使用三个文件表示每个表: 格式文件-存储表结构的定义(mytable.fm) 数据文件-存储表行的内容(mytable.MYD) 索引文件-存储表上索引(mytable.MYI):相当于目录 ---缩小扫描范围,提升查询效率 灵活的AUTO_INCREMENT字段处理 MyISAM存储引擎的存储优势:可被转换为压缩,只读表来节省空间 MyISAM存储引擎的存储劣势:不支持事务,安全性较低
InnoDB存储引擎:
这是MySQL默认的存储引擎, InnoDB支持事务,支持数据库崩溃后自动恢复机制,非常安全
是它最大的一个特点
它管理的表具有下列主要特征:
每个 InnoDB表在数据库目录中以.frm格式文件表示 InnoDB表空间tablespace被用于存储表的内容(表空间是一个逻辑名称,表空间存储数据+索引) 提供一组用来记录事务性活动的日志文件 用commit(提交),savepoint及rollback(回滚)支持事务处理 提供全acid兼容 在MySQL服务器崩溃后提供自动恢复 多版本(MVCC)和行级锁定 支持外键及引用的完整性,包括联级删除和更新
InnoDB最大的特点就是支持事务
:以保证数据的安全,效率不是很高,并且也不能压缩,不能转换为只读,不能很好地节省存储空间
MEMORY存储引擎:
使用MEMORY存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使得MEMORY存储引擎非常快
MEMORY存储引擎管理的表具有以下特征:
在数据库目录内,每个表均以.frm格式的文件表示 表数据及索引被存储在内存中 表级锁机制 不能包含TEXT或BLOB字段
MEMORY存储引擎之前被称为HEAP引擎
MEMORY存储引擎优点
:查询效率是最高的
MEMORY存储引擎缺点
:不安全,关机之后数据消失,因为数据和索引都是在内存当中
引入事务:
一个事务其实就是一个完整的业务逻辑,它是一个最小的工作单元,是不可再分的。
那么什么是一个完整的业务逻辑呢?
拿现实生活中的银行业务举例,假设转账,从A账户向B账户中转账10000,将A账户的钱减去10000(update语句),将B账户的钱加10000(update语句),这两步操作结合即为一个完整的业务逻辑。
以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分
只有DML语句[insert,delete,update]才会有事务,其他语句和事务无关
事务机制
当业务只需要一条DML语句就能完成,那么事务就没有存在的价值了,因为正是做某件事时,需要多条DML语句结合才能够完成,才需要事务的存在,事务本质就是多条DML语句同时执行,或者同时失败
事务机制的执行过程:
InnoDB存储引擎:提供一组用来记录事务性活动的日志文件
事务开启:
insert insert insert delete update update
事务结束!
在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中,在事务的执行过程中,我们可以提交事务,也可以回滚事务
提交事务:
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中,提交事务标志事务的结束,并且是一种全部成功的结束
回滚事务:
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件,回滚事务标志着事务的结束,并且是一种全部失败的结束
自动提交机制:
提交事务:commit; 回滚事务:rollback;[回滚永远都是只能回滚到上一次的提交点]
经过如下测试:
我们得出,MySQL默认情况下是自动提交事务的,即为每执行一条DML语句,则提交一次
这种自动提交实际上是不符合我们的开发习惯,因为每一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的安全,必须要求同时成功之后再提交所以不能执行一条就提交一条
关闭自动提交机制:
执行下述语句;
start transaction;
人为提交事务:
事务的4个特性:
A:原子性
说明事务是最小的工作单元,不可再分
C:一致性
所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性
I:隔离性
A事务和B事务具有一定的隔离
教室A和教室B之间有一道墙,所谓个隔离性就是指这道墙,A事务在操作一张表的时候,另一个事务B也操作这张表,相当于多线程并发访问同一张表
而A教室和B教室之间所隔的墙,可以很厚,也可以很薄,这就是事务的隔离级别,这道墙越厚,表示隔离级别越高
事务和事务之间的隔离级别有哪些?
读未提交:
read uncommitted(最低的隔离级别),事务A可以读取到事务B未提交的数据,这种隔离级别存在的问题就是:脏读现象(Dirty Read),即为读到了脏数据,这种隔离级别一般都是理论上的,大多数的数据库隔离级别第二档起步
验证
:
查看当前MySQL使用的隔离级别:
8.0以下版本使用该命令:
select @@tx_isolation;
设置隔离级别为read uncommitted
执行下述命令:
set global transaction isolation level read uncommitted;