zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mysql的一些基本常识(约束 、事务,事务隔离级别)

mysql事务 一些 约束 级别 隔离
2023-09-27 14:22:13 时间

一 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

MySQL的四种事务隔离级别 - 花弄影 - 博客园