总的可以分为这几个部分(记忆为3344):
三大范式 三个SQL语言集
四个完整性约束 四个数据库的事务特性
三大范式:
第一范式:
原子性:是指每列的数据不能再分裂出其他的列
例如:联系人的中的姓名,电话,性别,其中电话不属于第一范式,要属于第一范式的话就要对电话在进一步分裂(姓名,性别,手机,家庭电话)
第二范式:
在满足第一范式的情况下,每一列的数据都与主键有关系
例如:订单的编号,生产编号,价格,生产日期,其中生产编号与订单的信息没有直接关系所以可以去掉
第三范式:
在满足第二范式的情况下,所有的列都与主键有关(这个关系是指全部满足对主键的关系而不是部分)也不依赖于其他主键
例如订单的信息(订单号,产品,单价,顾客姓名,顾客编码),其中顾客姓名与顾客编码相关所以应该吧顾客姓名去除
总结:
第一范式:(1NF)无重复的列
第二范式:(2NF)属性完全依赖于主键
第三范式:(3NF)属性不依赖于其它非主属性
三个SQL语言集:
DDL:数据定义语言,创建,删除,修改表
DML:数据操纵语言,增删改查(或者分为DML增删改和DQL查)
DCL:数据控制语言,授权 ,收权
四个完整性约束:
完整性约束:数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。数据完整性分为四类:
实体完整性(Entity Integrity)、域完整性(Domain Integrity)、参照完整性(Referential Integrity)、用户定义的完整性(User-definedIntegrity)
实体完整性(Entity Integrity): 实体完整性规定表的每一行在表中是唯一的实体。
在数据表中可以对相应字段进行如下约束来实现实体完整性:
UNIQUE(唯一约束)
PRIMARY KEY(主键约束)
IDENTITY(标识列)
域完整性(Domain Integrity) : 是指数据库表中的列必须满足某种特定的数据类型或约束。
域完整性有以下几种约束:
CHECK(检查约束)
FOREIGN KEY(外键约束)
DEFAULT(默认值约束)
NOT NULL(不为空值约束)
参照完整性(Referential Integrity): 是指两个表的主关键字和外关键字的数据应对应一致。
参照完整性作用表现在如下几个方面:
禁止在从表中插入包含主表中不存在的关键字的数据行
禁止会导致从表中的相应值孤立的主表中的外关键字值改变
禁止删除在从表中的有对应记录的主表记录
用户定义的完整性(User-defined Integrity): 是针对某个特定关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。用户自己定义的,比如年龄大小在0-100,人民币面值最大为100
四个数据库的事务特性:
在这之前先说一下事务的概念:
在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。
判断事务是否配置成功的关键点在于出现异常时事务是否会回滚,事务的隔离性是指一个事务的执行不能被其他事务干扰。
事务目的:
事务会把数据库从-一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所有修改都不保存。
为了让多个SQL语句作为一个事务执行:
(1)执行语句前调用 Connection 对象的 setAutoCommit(false);
以取消自动提交事务
(2)在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
(3)在出现异常时,调用 rollback(); 方法回滚事务。
数据库事务需要满足四个特性,ACID,
原子性(Atomic): 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency): 一致性指事务将数据库从一种状态转变为另一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束(实体,域,参照完整性,用户自定义)没有被破坏。
隔离性(Isolation): 隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据(指一个事务的执行不能被其他事务干扰)
持久性(Durability): 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
高可用和高可靠:
但若不是数据库本身发生故障,而是一-些外部的原因,如RAID卡损坏、自然灾害等原因导致数据库发生问题,那么所有提交的数据可能都会丢失。因此持久性保证事务系统的高可靠性(HighReliability),而不是高
可用性(High Availability)。对于高可用性的实现,事务本身并不能保证,需要-一些系统共同配合来完成。
不考虑事务的隔离性,会发生的问题:
1,脏读, 是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
2,不可重复读, 是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
不可重复读和脏读的区别: 脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
3,虚读(幻读) 是事务非独立执行时发生的一种现象。在当前事务中,读取到了另一事务提交的插入的数据
幻读和不可重复读 都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。默认的
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。