0
点赞
收藏
分享

微信扫一扫

MySQL学习笔记(三)

目录

一、约束

1、约束种类

2、非空约束

3、唯一性约束

4、主键约束

5、外键约束

二、事务

1、概念

2、原理

3、事务的特性

4、演示事务


一、约束

· 创建表的时候,给表的字段添加约束是为了保证数据的合法性,完整性,有效性

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;

数据读取时进行排队读取,前一个事务提交完成后,才能进行数据的读取

举报

相关推荐

0 条评论