美文网首页
MySQL的多表间关系

MySQL的多表间关系

作者: 程序员丶星霖 | 来源:发表于2022-11-30 09:03 被阅读0次

一、数据库三范式

1.1 第一范式:确保每列保持原子性

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

如果不遵守第一范式,查询出数据还需要进一步处理(查询不方便)。遵守第一范式,需要什么字段的数据就查询什么数据(方便查询)。

1.2 第二范式:确保表中的每列都和主键相关

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关。

也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存到同一张数据库表中。

1.3 第三范式:确保每列都和主键列直接相关,而不是间接相关

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

二、外键约束

2.1 外键约束的概念

在遵循三范式的前提下,很多时候需要进行拆表,将数据分别存放多张表中,以减少冗余数据。但是拆分出来的表与表之间是有着关联关系的,必须得通过一种约束来约定表与表之间的关系,这种约束就是外键约束。

2.2 外键约束的作用

外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个表的字段之间的参照关系。

2.3 创建外键约束的语法

2.3.1 在建表时指定外键约束

-- 外键
-- 1. 创建部门表
CREATE TABLE dept(
    id INT PRIMARY KEY AUTO_INCREMENT,
    dept_name VARCHAR(50),
    dept_location VARCHAR(50)
);

-- 2. 创建员工表,并且在员工表中添加一个外键指向部门表的id主键
CREATE TABLE emp(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(50) NOT NULL,
    sex VARCHAR(10),
    dept_id INT,
    CONSTRAINT fkey_01 FOREIGN KEY (dept_id) REFERENCES dept (id) -- 在建表时指定外键约束
);

2.3.2 在建表后指定外键约束

-- 在创建表之后添加外键
alter table emp add constraint  fkey_01 foreign key (dept_id) references dept (id);

2.4 删除外键约束的语法

-- 删除外键
ALTER TABLE emp DROP FOREIGN KEY fkey_01;

2.5 外键约束的要求

  • 在从表上建立外键,并且主表要先存在;
  • 一个表可以建立多个外键约束;
  • 通常情况下,从表的外键列一定要指向主表的主键列;
  • 从表的外键列与主表被参照的列名可以不相同,但数据类型必须相同。

2.6 外键约束等级

  • Cascade方式:在主表上update/delete记录时,同步update/delete掉从表的匹配记录
  • Set null方式:在主表上update/delete记录时,将从表上匹配记录的列设为null,但是要注意子表的外键列不能为not null
  • No action方式:如果子表中有匹配的记录,则不允许对主表对应候选键进行update/delete操作
  • Restrict方式:同no action,都是立即检查外键约束
  • Set default方式:主表有变更时,子表将外键列设置成一个默认的值,但是InnoDB不能识别

如果没有指定等级,就相当于Restrict方式。

三、多表间关系

3.1 一对多关系

3.1.1 概念

一对多的关系是指主表的一行数据可以同时对应从表的多行数据,反过来就是从表的多行数据指向主表的同一行数据。

3.1.2 应用场景

分类表和商品表、班级表和学生表、用户表和订单表。

3.1.3 建表原则

将一的一方作为主表,多的一方作为从表,在从表中指定一个字段作为外键,指向主表的主键。

-- 2. 一对多的表关系
-- 建表原则:以一的一方作为主表,多的一方作为从表,在从表中指定一个字段作为外键指向主表的主键
CREATE TABLE category(
    cid INT PRIMARY KEY AUTO_INCREMENT,
    cname VARCHAR(50)
);

CREATE TABLE product1(
    pid INT PRIMARY KEY AUTO_INCREMENT,
    pname VARCHAR(50),
    price DOUBLE,
    cid INT
);

3.2 多对多关系

3.2.1 概念

两张表都是多的一方,A表的一行数据可以同时对应B表的多行数据,反之B表的一行数据也可以同时对应A表的多行数据

3.2.2 应用场景

订单表和商品表、学生表和课程表

3.2.3 建表原则

新建一张中间表,在中间表中定义两个字段,这两个字段分别作为外键指向两张表各自的主键。

-- 3. 多对多的表关系
-- 建表原则:两张表都是多的一方,要新创建一张中间表,在中间表中指定俩字段分别作为外键指向两张主表的主键
CREATE TABLE student1(
    sid INT PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(50)
);

CREATE TABLE course(
    cid INT PRIMARY KEY AUTO_INCREMENT,
    cname VARCHAR(20)
);

CREATE TABLE t_s_c(
    sno INT,
    cno INT
);


ALTER TABLE t_s_c ADD CONSTRAINT fkey01 FOREIGN KEY (sno) REFERENCES student1 (sid);
ALTER TABLE t_s_c ADD CONSTRAINT fkey03 FOREIGN KEY (cno) REFERENCES course (cid);

3.3 一对一关系

3.3.1 两种一对一关系

  • 从表的一行数据只能对应主表的一行数据。
  • A表中的一行数据对应B表中的一行数据,反之B表中的一行数据也对应A表中的一行数据。

3.3.2 建表原则

在从表中指定一个字段创建外键并指向主表的主键,然后给从表的外键字段添加唯一约束。

学海无涯苦作舟

相关文章

  • MySQL的多表间关系

    一、数据库三范式 1.1 第一范式:确保每列保持原子性 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可...

  • 02MySQL的多表操作

    MySQL的多表操作 1 多表关系 MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多 1.1...

  • MySql多表关系

    layout: posttitle: MySql多表关系subtitle: 一对一,一对多,...

  • mysql 多表关系

    使用mysql进行表设计的基础就需要了解多表关系结构:一对一、一对多、多对多 1. 一对一 一个班级对应一个班主任...

  • MySQL基础——多表查询

    上篇文章我们学习了MySQL基础——约束,这篇文章我们学习MySQL基础——多表查询。 多表关系 在数据表中,各个...

  • mysql-多表之间的关系

    在关系型数据库中,表与表之间的关系是通过主键与外键来体现的。而表与表之间的关系主要有三种:一对一关系,一对多(多对...

  • mysql实现多表关联

    mysql实现多表关联 mysql关联单张表

  • 深入浅出MySQL(五)

    多表查询 MySQL中的多表联查 MySQL中多表查询分为三种形式: 笛卡尔积的形式 内连接的形式 外连接的形式 ...

  • MySQL 多表操作

    day07-多表操作 今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建...

  • mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MY...

网友评论

      本文标题:MySQL的多表间关系

      本文链接:https://www.haomeiwen.com/subject/csqdfdtx.html