Mysql学习(四) --------- 约束、存储引擎及事务


一、 约束

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
主键值建议使用:intbigintchar等类型.
不建议使用: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(提交)SAVEPOINTROLLBACK(回滚)支持事务处理
		– 提供全 ACID 兼容
		– 在 MySQL 服务器崩溃后提供自动恢复
		– 多版本(MVCC)和行级锁定
		– 支持外键及引用的完整性,包括级联删除和更新
	
	InnoDB最大的特点就是支持事务:
		以保证数据的安全。效率不是很高,并且也不能压缩,不能转换为只读,
		不能很好的节省存储空间
******************************************************************************
3. MEMORY存储引擎
	使用 MEMORY 存储引擎的表,其数据存储在内存中,且行的长度固定,
	这两个特点使得 MEMORY 存储引擎非常快。

	MEMORY 存储引擎管理的表具有下列特征:
		– 在数据库目录内,每个表均以.frm 格式的文件表示。
		– 表数据及索引被存储在内存中。(目的就是快,查询快!)
		– 表级锁机制。
		– 不能包含 TEXTBLOB 字段。

	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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在森林中麋了鹿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值