目录
一、约束
· 创建表的时候,给表的字段添加约束是为了保证数据的合法性,完整性,有效性
1、约束种类
非空约束(not null):约束的字段不能为NULL
唯一约束(unique):约束的字段不能重复
主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
外键约束(foreign key):(简称FK)
检查约束(check):目前 Mysql 数据库中不支持check,Oracle数据库支持
2、非空约束
用法示例:
初始化表中字段时给定 not null 约束,即为非空约束,约束的字段不能为NULL not null只有列级约束,即只能在字段后面添加约束
报错信息:
3、唯一性约束
唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL 用法示例:
drop table if exists 表名; create table 表名( id int, 字段1 varchar(255), 字段2 varchar(255) unique//添加唯一性约束 );
报错信息:
给联合字段添加unique约束:
drop table if exists 表名; create table 表名( id int, 字段1 varchar(255), 字段2 varchar(255), unique(字段1,字段2) //添加表级唯一性约束 );
· 上例代码表示给两个字段添加联合的唯一性约束(表级约束) · 只有当字段1和字段2均相同时才被当作相同的字段,否则都不相同
drop table if exists 表名; create table 表名( id int, 字段1 varchar(255) unique, 字段2 varchar(255) unique );
· 上例代码表示给两个字段分别添加唯一性约束(列级约束)
4、主键约束
1、用法示例
drop table if exists 表名; create table 表名( id int primary key, //添加列级主键约束 字段1 varchar(255), 字段2 varchar(255), );
报错信息:
当字段添加主键约束后,数据插入时主键字段不能未为NULL或重复 主键约束为列级约束
2、主键作用
表的设计三范式中第一范式要求,任何表都应该有主键 主键值是这行记录在这张表当中的唯一标识(作用类似身份证)
3、主键分类
根据字段数量分类:
单一主键(常用的,推荐的)
复合主键:多个字段联合起来添加一个主键约束(不推荐的)
根据主键性质来划分:
自然主键:主键和业务无关(推荐)
业务主键:和业务挂钩的作为主键
· 一张表的主键约束只能有1个
4、使用表级约束的方式定义主键
drop table if exists 表名; create table 表名( id int, 字段1 varchar(255), primary key(id) //添加表级主键约束 );
5、主键值自增
drop table if exists 表名; create table 表名( id int primary key auto_increment, 字段1 varchar(255), );
自增关键字:auto_increment 自增主键从1开始,以1递增
5、外键约束
案例理解:请设计数据库表,用来维护学生和班级信息
t_student表中的cno字段引用t_class中的cno字段,此时t_student为子表,t_class为父表 建表过程中,先创建父表再创建子表 删表过程中,先删除子表再删除父表 添加数据与删除数据同理
1、语法
drop table if exists 父表; drop table if exists 子表; create table 父表( 字段1 int , 字段2 varchar(255), primary key(字段1) ); create table 子表( 字段3 int , 字段4 varchar(255), primary key(字段3), foreign key(字段3) references 父表(字段1) // 添加外键约束 );
PS:外键值可以为NULL; 外键引用别的表的字段时,该字段不一定是被引用表的主键,但必须具有唯一性
二、事务
1、概念
· 一个事务是一个完整的业务逻辑单元,不可分割。事务能够保证多个操作原子性,要么同时成功,要么同时失败。 · 和事务相关的语句只有DML语句(insert,delete,update),且只有DML三个语句在缓存里进行操作,其他语句都不会对缓存进行操作。
2、原理
提交事务——所执行的操作会被持久化到硬盘中,即修改硬盘数据,并删除所有执行记录 回滚事务——不与硬盘上的数据进行交互,只清空执行记录
commit:提交事务——将记录持久化到硬盘中 rollback:回滚事务——回滚到上一次的事务提交点
3、事务的特性
四大特性:ACID
A:原子性:事务是最小的工作单元,不可再分
C:一致性:事务必须保证多条DML语句同时成功或者同时失败
I:隔离性:事务A与事务B之间具有隔离
D:持久性:最终数据必须持久化到硬盘文件中,事务才算成功的结束
1、事务隔离性
四个隔离级别:
第一级别:读未提交(read uncommitted) 对方事务还没有提交,我们当前事务可以读取对方未提交的数据;读未提交存在脏读现象(Dirty read):表示读到了脏数据
第二级别:读已提交(read committed) 对方事务提交后的数据,我方事务可以读取;具有不可重复读取数据的性质(事务不断因为提交而更新,故不可重复读);解决脏读现象
第三级别:可重复读(repeatable read) 解决了不可重复读的问题;读取到的数据是幻象
第四级别:序列化读/串行化读(serializable) 效率低问题
· mysql事务默认情况下是自动提交的(每执行一条语句,将会向硬盘中持久化一条记录);可使用start transaction关闭自动提交机制,关闭后需要使用commit;语句进行事务的提交
4、演示事务
· 设置事务的全局隔离级别 set global transaction isolation level read (uncommitted/read committed/...); · 查看事务的全局隔离级别 select @@global.tx_isolation;
1、读未提交
set global transaction isolation level read uncommitted;
对方事务未进行提交,可以读取数据 SMITH
2、读已提交
set global transaction isolation level read committed;
进行提交操作后,可以读取数据 test
3、可重复读
set global transaction isolation level repeatable read;
使用查询语句读取的是幻象数据,实际的硬盘数据已经被更改了
4、串行化读
set global transaction isolation level serializable;
数据读取时进行排队读取,前一个事务提交完成后,才能进行数据的读取