目录
一、 约束
1. 定义
约束:constraint,在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性。
2. 分类
非空约束:not null
唯一性约束: unique
主键约束: primary key (简称PK)
外键约束:foreign key(简称FK)
检查约束:check(mysql不支持,oracle支持)
3. 功能介绍
1. 非空约束:not null
非空约束not null约束的字段不能为NULL
2. 唯一性约束: unique
唯一性约束unique约束的字段不能重复,但是可以为NULL
3. 主键约束:primary key
主键值是每一行记录的唯一标识, 任何一张表都应该有主键,没有主键,表无效.
主键的特征:not null + unique
主键值建议使用:int、bigint、char等类型.
不建议使用:varchar来做主键.
主键值一般都是数字,一般都是定长的.
4. 外键约束:foreign key
是表的一个特殊字段, 经常与主键约束一起使用.对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表).外键用来建立主表与从表的关联关系, 为两个表的数据建立连接, 约束两个表中数据的一致性和完整性.比如, 一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果, 那么, 你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的.子表中的外键引用的父表中的某个字段,其不一定是主键,但至少具有unique约束.
4. 添加约束
1. 添加非空约束
create table t_student(
id int not null,
name char(32) not null
);
2. 添加唯一性约束
create table t_student(
id int unique,
name char(32)
)
create table t_student(
id int ,
name char(32),
unique(id)
);
若是让id与name联合起来有唯一性:
create table t_student(
id int ,
name char(32),
unique(id, name)
);
3. 添加主键约束
create table t_student(
id int primary key auto_increment, //自动维护主键值
name char(32)
);
create table t_student(
id int ,
name char(32),
primary key(id);
);
//在实际开发中建议使用单一主键, 不使用以多个字段联合起来构成的主键.
4. 添加外键
create table t_student(
id int ,
name char(32),
foreign key (本表字段) references 父表(字段)
);
create table t_student(
id int ,
name char(32),
constraint fk_子表名_父表名 foreign key(本表字段) references 父表(字段)
)
create table t_student(
id int ,
name char(32)
);
alter table 表名 add foreign key (本表字段) references 父表(字段);
5. 存在外键约束的两张表的操作顺序
删除表的顺序?
先删子,再删父。
创建表的顺序?
先创建父,再创建子。
删除数据的顺序?
先删子,再删父。
插入数据的顺序?
先插入父,再插入子。
二、存储引擎
1. 概述
存储引擎是MySQL中特有的一个术语,其它数据库中没有。实际上存储引擎是一个表存储/组织数据的方式。不同的存储引擎,表存储数据的方式不同。
2. 怎么给表添加存储引擎?
create table t_student(
id int ,
name char(32)
)engine=InnoDB default charset=utf8;
3. Mysql中支持的存储引擎
show engines \G
*************************** 1. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 5. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 8. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
4. 常用存储引擎介绍
******************************************************************************
1. MyISAM存储引擎
它管理的表具有以下特征:
使用三个文件表示每个表:
-格式文件 — 存储表结构的定义(mytable.frm)
-数据文件 — 存储表行的内容(mytable.MYD)
-索引文件 — 存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围,提高查询效率的一种机制。
可被转换为压缩、只读表来节省空间
提示一下:
-对于一张表来说,只要是主键,
-或者加有unique约束的字段上会自动创建索引。
MyISAM存储引擎特点:
-可被转换为压缩、只读表来节省空间
-这是这种存储引擎的优势
MyISAM不支持事务机制,安全性低。
******************************************************************************
2. InnoDB存储引擎
这是mysql默认的存储引擎,同时也是一个重量级的存储引擎。
InnoDB支持事务,支持数据库崩溃后自动恢复机制。
InnoDB存储引擎最主要的特点是:非常安全。
它管理的表具有下列主要特征:
– 每个 InnoDB 表在数据库目录中以.frm 格式文件表示
– InnoDB 表空间 tablespace 被用于存储表的内容(表空间是一个逻辑名称。表空间存储数据+索引。)
– 提供一组用来记录事务性活动的日志文件
– 用 COMMIT(提交)、SAVEPOINT 及ROLLBACK(回滚)支持事务处理
– 提供全 ACID 兼容
– 在 MySQL 服务器崩溃后提供自动恢复
– 多版本(MVCC)和行级锁定
– 支持外键及引用的完整性,包括级联删除和更新
InnoDB最大的特点就是支持事务:
以保证数据的安全。效率不是很高,并且也不能压缩,不能转换为只读,
不能很好的节省存储空间
******************************************************************************
3. MEMORY存储引擎
使用 MEMORY 存储引擎的表,其数据存储在内存中,且行的长度固定,
这两个特点使得 MEMORY 存储引擎非常快。
MEMORY 存储引擎管理的表具有下列特征:
– 在数据库目录内,每个表均以.frm 格式的文件表示。
– 表数据及索引被存储在内存中。(目的就是快,查询快!)
– 表级锁机制。
– 不能包含 TEXT 或 BLOB 字段。
MEMORY 存储引擎以前被称为HEAP 引擎。
MEMORY引擎优点:查询效率是最高的。不需要和硬盘交互。
MEMORY引擎缺点:不安全,关机之后数据消失。因为数据和索引都是在内存当中。
三、事务
1. 概念
一个事务其实就是一个完整的业务逻辑,就是批量的DML语句同时成功,或者同时失败。
2. 相关术语
commit :
提交事务
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
提交事务标志着,事务的结束。并且是一种全部成功的结束。
rollback :
回滚事务
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
回滚事务标志着,事务的结束。并且是一种全部失败的结束。
回滚永远都是只能回滚到上一次的提交点。
3. 开启事务
mysql默认情况下是支持自动提交事务的。每执行一条DML语句,则提交一次。这种自动提交实际上是不符合我们的开发习惯,因为一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条就提交一条。
如何关闭事务的提交并开启事务?
start transaction;
4. 事务的四个特性(ACID)
A:原子性
说明事务是最小的工作单元。不可再分。
C:一致性
所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,
以保证数据的一致性。
I:隔离性
A事务和B事务之间具有一定的隔离。
D:持久性
事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据
保存到硬盘上。
5. 事务的隔离性
读未提交:read uncommitted(最低的隔离级别)
什么是读未提交?
事务A可以读取到事务B未提交的数据。
这种隔离级别存在的问题就是:
脏读现象!(Dirty Read)
我们称读到了脏数据。
这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!
读已提交:read committed
什么是读已提交?
事务A只能读取到事务B提交之后的数据。
这种隔离级别解决了什么问题?
解决了脏读的现象。
这种隔离级别存在什么问题?
不可重复读取数据。
什么是不可重复读取数据呢?
在事务开启之后,第一次读到的数据是3条,当前事务还没有
结束,可能第二次再读取的时候,读到的数据是4条,3不等于4称为不可重复读取。
这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。
oracle数据库默认的隔离级别是:read committed
可重复读:repeatable read
什么是可重复读取?
事务A开启之后,不管是多久,每一次在事务A中读取到的数据
都是一致的。即使事务B将数据已经修改,并且提交了,事务A
读取到的数据还是没有发生改变,这就是可重复读。
可重复读解决了什么问题?
解决了不可重复读取数据。
可重复读存在的问题是什么?
可以会出现幻影读。
mysql中默认的事务隔离级别就是这个
序列化/串行化:serializable(最高的隔离级别)
这是最高隔离级别,效率最低。解决了所有的问题。
这种隔离级别表示事务排队,不能并发!
synchronized,线程同步(事务同步)
每一次读取到的数据都是最真实的,并且效率是最低的。
6. 设置事务的隔离级别
set global transaction isolation level read uncommitted/ read committed/ repeatable read/ serializable