mysql的一些基本常识(约束 、事务,事务隔离级别)
一 mysql的基本数据类型
二 mysql中查询
2.1.where与having的区别
1.都是对条件进行筛选;
2.where是分组前对设置条件筛选;having是对分组后的数据进行过滤筛选
3.where 后面不能使用聚合函数;having后面可以跟聚合函数。
2.2 查询完整语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2.3 约束
约束: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。
2.3.1 非空约束:
not null,值不能为null
1. 创建表时添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
2. 创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
3. 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
2.3.2 唯一约束 unique
1. 创建表时,添加唯一约束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);
* 注意mysql中,唯一约束限定的列的值可以有多个null
2. 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
3. 在创建表后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
2.3.3 主键约束
1. 注意:
1. 含义:非空且唯一
2. 一张表只能有一个字段为主键
3. 主键就是表中记录的唯一标识
2. 在创建表时,添加主键约束
create table stu(
id int primary key,-- 给id添加主键约束
name varchar(20)
);
3. 删除主键
-- 错误 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;
4. 创建完表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
5. 自动增长:
1. 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
2. 在创建表时,添加主键约束,并且完成主键自增长
create table stu(
id int primary key auto_increment,-- 给id添加主键约束
name varchar(20)
);
3. 删除自动增长
ALTER TABLE stu MODIFY id INT;
4. 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
2.3.4 外键约束
1. 在创建表时,可以添加外键
* 语法:
create table 表名(
....
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
2. 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
3. 创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
创建部门表:
create table tb_department(
id int(5) primary key auto_increment ,
dp_name varchar(50))
创建员工表:
create table tb_yuangong(
id int(5) primary key auto_increment,
emp_name varchar(50),
depart_id int(5),
constraint fk_depart_id foreign key (depart_id) references tb_department(id)
)
2.3.5 级联操作
1. 添加级联操作
语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ;
2. 分类:
1. 级联更新:ON UPDATE CASCADE
2. 级联删除:ON DELETE CASCADE
设置级联操作:
ALTER TABLE tb_yuangong DROP FOREIGN KEY fk_depart_id;
ALTER TABLE tb_yuangong ADD CONSTRAINT fk_depart_id FOREIGN KEY (depart_id) REFERENCES tb_department(id) ON UPDATE CASCADE ON DELETE CASCADE;
将主表的id为1设置为5,查看从表
可以看到自动更新为id为5,
总结:级联操作主表发生修改,删除,从表也跟着改动。
2.4 范式
第一范式: 强调的是原子性;要求各个列不可再分解。
第二范式:强调的是唯一性;消除各个列之间的部分依赖
第3范式:情调的是冗余性;字段不存在多余,即消除传递依赖。
数据库逻辑设计之三大范式通俗理解,一看就懂,书上说的太晦涩 - 知乎
2.5 备份
进入到mysql数据库的安装目录的bin目录下: mysqldump -uroot -p 数据库名称 > 存储路径
使用命令行将mysql数据库导入导出操作_健康平安的活着的专栏-CSDN博客
2.6 事务
2.6.1 事务的性质
一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
3. 隔离性:多个事务之间。相互独立。
4. 一致性:事务操作前后,数据总量不变
多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
2.6.2 事务的隔离级别
1.事务的并发问题:
1.脏读:一个事务,读取到另一个事务中没有提交的数据,如:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样,如:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
3幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。如幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
2.事务的隔离级别: 1.读未提交,2.不可重复读 3.可重复读,4.串行化
1.read uncommitted(读未提交)
可以看到未提交的数据(脏读),举个例子:别人说的话你都相信了,但是可能他只是说说,并不实际做。
事务隔离级别为读未提交时,写数据只会锁住相应的行
2.read committed(不可重复读)
读取提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。用读写的观点就是:读取的行数据,可以写。(没有锁,可以随意的修改写操作)
3.repeatable read(MySQL默认隔离级别,可重复读)
可以重复读取,但有幻读。读写观点:读取的数据行不可写,但是可以往表中新增数据。在MySQL中,其他事务新增的数据,看不到,不会产生幻读。采用多版本并发控制(MVCC)机制解决幻读问题。
事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
4.serializable
可读,不可写。像java中的锁,写数据必须等待另一个事务结束。
事务隔离级别为串行化时,读写数据都会锁住整张表
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
https://www.cnblogs.com/study-makes-me-happy/articles/8989412.html
相关文章
- Hudi-Flink CDC将MySQL数据写入hudi
- 【MySQL】MySQL的事务
- MySQL事务隔离
- 去IOE,MySQL完胜PostgreSQL
- Mysql数据库优化配置文件my.ini文件配置解释
- MySQL 事务详解
- mysql多表查询 1.外键与级联
- 为什么 MySQL 回滚事务也会导致 ibd 文件增大?
- 基于Java+MySQL实现(界面)某高校科研管理系统【100010633】
- Pgsql和Mysql的对比
- 浅谈tidb事务与MySQL事务之间的区别
- mysql的IFNULL()函数FLOOR(),ROUND()函数
- 一文讲清楚MySQL事务隔离级别和实现原理,开发人员必备知识点
- ubuntu mysql 忽略大小写配置
- MySQL事务隔离级别
- Linux (centos8)安装 MySQL 8 数据库(图文详细教程)
- mysql中的触发器和事务的操作
- 【问题】如何解决sql server链接mysql后,使用分布式事务?
- mysql中的事务隔离级别与锁
- (1.3)mysql 事务控制和锁定语句
- MySQL事务内幕与ACID
- 【数据库】MySQL概念知识语法-基础篇(DQL),真的很详细,一篇文章你就会了
- MySQL四种事务隔离级的说明
- CentOS 7修改MySQL 5.6字符集为UTF-8
- 高性能 MySQL(三):事务与锁详解