MySQL约束和事务

1. 约束

  1. 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性
  2. 分类
    1. 非空约束:not null
    2. 唯一约束:unique
    3. 主键约束:primary key
    4. 外键约束:foreign key
  3. 非空约束not null,限制某一列的值不能为null
    1. 创建表时添加约束
      CREATE TABLE stu(
          id INT,
          NAME VARCHAR(20) NOT NULL -- name不能为null
      );
      复制代码
    2. 创建表后添加约束:ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
    3. 删除约束:ALTER TABLE stu MODIFY NAME VARCHAR(20);
  4. 唯一约束unique,限制某一列的值不能重复
    1. 受约束的列最多只能有一条记录为null
    2. 创建表时添加约束
      CREATE TABLE stu(
          id INT,
          phone_number VARCHAR(20) UNIQUE -- 手机号
      );
      复制代码
    3. 创建表后添加约束:ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
    4. 删除唯一约束:ALTER TABLE stu DROP INDEX phone_number;
  5. 主键约束primary key
    1. 注意
      1. 主键非空且唯一
      2. 主键就是记录的唯一标识
      3. 一张表只能有一个字段为主键
    2. 创建表时添加约束
      create table stu(
          id int primary key,-- 给id添加主键约束
          name varchar(20)
      );
      复制代码
    3. 创建表后添加约束:ALTER TABLE stu MODIFY id INT PRIMARY KEY;
    4. 删除主键约束
      • (错误)alter table stu modify id int;
      • (正确)ALTER TABLE stu DROP 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 AUTO_INCREMENT;
      4. 删除自动增长:ALTER TABLE stu MODIFY id INT;
  6. 外键约束foreign key,让表与表产生关系,从而保证数据的正确性
    1. 创建表时添加外键:
      create table 表名(
          ...
          外键列名 数据类型,
          constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名)
      );
      复制代码
    2. 删除外键:alter table 表名 drop foreign key 外键名称;
    3. 创建表后添加外键:alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名);
    4. 级联操作
      • 添加级联:alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名) on update cascade on delete cascade;
      • 级联分类
        1. 级联更新:on update cascade
        2. 级联删除:on delete cascade
    5. 外键可以为null,但是不可以为不存在的外键值

2. 数据库的设计

1. 多表之间的关系

  1. 一对多(多对一)
    • 的一方建立外键,指向的一方的主键
  2. 多对多
    • 借助第三张中间表,中间表至少包含两个字段,这两个字段作为中间表的外键,分别指向两张表的主键
  3. 一对一
    • 在任意一方添加唯一外键指向另一方的主键
    • 一对一通常合并为一张表,不必拆分为两张表。

2. 范式

  1. 概念
    • 设计数据库时,为了设计出合理的关系型数据库,所遵循的不同的规范要求
  2. 相关概念
    • 函数依赖
      • B依赖于A:通过A属性(属性组)的值,可以唯一确定B属性的值
      • 例如:学号->姓名,(学号,课程名称)->成绩
    • 完全函数依赖
      • B完全依赖于A:A是一个属性组,A属性组中所有的属性值才能唯一确定B属性的值
      • (学号,课程名称)->成绩
    • 部分函数依赖
      • B部分依赖于A:A是一个属性组,A属性组中部分属性值就能唯一确定B属性的值
      • (学号,课程名称)->姓名
    • 传递函数依赖
      • C传递依赖于A:C依赖于B,B依赖于A
      • 学号->专业->辅导员
      • 被其他所有属性完全依赖的属性(属性组)
    • 主属性:码属性组的所有属性
    • 非主属性:除了码属性组中属性的其他属性
  3. 分类
    • 第一范式(1NF)
      • 每一列都是不可分割的原子数据项
    • 第二范式(2NF)
      • 在1NF的基础上,非主属性必须完全依赖于主属性(在1NF的基础上,消除非主属性对主属性的部分函数依赖)
    • 第三范式(3NF)
      • 在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF的基础上,消除传递依赖)
    • 巴斯-科德范式(BCNF)
    • 第四范式(4NF)
    • 第五范式(5NF,又称完美范式)

3. 数据库的备份和还原

  1. 命令行方式
    1. 备份:mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
    2. 还原
      1. 登录数据库
      2. 创建数据库
      3. 使用数据库
      4. 执行文件:source 文件路径
      mysqldump -uroot -proot db4 > d://a.sql -- 备份
      -- 删除数据库db4之后
      mysql -uroot -proot -- 登录数据库
      create database db4; -- 创建数据库
      use db4; -- 使用数据库
      source d://a.sql -- 执行文件
      复制代码
  2. 图形化工具方式

4. 事务

  1. 概念:一个事务包含的多个操作,这些操作要么同时成功,要么同时失败
  2. 操作
    1. 开启事务:start transaction;
    2. 回滚:rollback;
    3. 提交:commit;
  3. 提交事务的方式
    1. 自动提交(MySQL):执行一条DML语句会自动提交一次事务
    2. 手动提交(Oracle):需要先开始事务,再提交
    • 查看事务的提交方式:select @@autocommit;
      • 1:表示自动提交(默认)
      • 0:表示手动提交
    • 修改事务的提交方式:set @@autocommit = 0;
  4. 事务的四大特征
    1. 原子性:事务是不可分割的最小操作单位,事务所包含的操作要么同时成功,要么同时失败
    2. 持久性:当事务提交或回滚后,数据库会持久化地保存数据
    3. 隔离性:多个事务之间是相互独立的
    4. 一致性:事务操作前后,数据总量不变
  5. 事物的隔离级别
    1. 概念:多个事务之间是相互独立的,但是如果多个事务同时操作同一批数据,就会引发一些问题,设置不同的隔离级别可以解决这些问题
    2. 存在的问题
      1. 脏读:一个事务读取到了另一个事务还未提交的数据
      2. 不可重复读(虚读):对于同一个事务,两次读取到的数据不一样
      3. 幻读:A事务操作(DML)表中的所有记录,B事务添加了一条数据,那么A事务查询不到自己的更改
    3. 隔离级别
      1. read uncommitted:读未提交
        • 存在的问题:脏读、不可重复读、幻读
      2. read committed:读已提交(Oracle默认)
        • 存在的问题:不可重复读、幻读
      3. repeatable read:可重复读(MySQL默认)
        • 存在的问题:幻读
      4. serializable:串行化
        • 解决了所有问题
      • 隔离级别从小到大安全性越来越高,但是效率越来越低
      • 查询隔离级别:select @@tx_isolation
      • 设置隔离级别:set global transaction isolation level 隔离级别字符串;
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享