mysql学习笔记(3):多表创建及多表之间的关系(外键约束)

本文尝试用实际开发中常见的电商场景来厘清其背后需要的数据库中表与表之间的关系,目的在于能够分析出常见购物网站的中实体间的关系,并能创建出对应的表。

文章目录

  • 1.实体间常见关系
  • 2.数据库实现(一对多)
    • 2.1一对多情况的引入
    • 2.2利用外键实现一对多
    • 2.3数据库实现(一对多)
      • 2.3.1不设置外键的情况
      • 2.3.2为主(多)表和从(一)表之间添加外键
      • 2.3.3添加外键约束后的2个特点(重要)
      • 2.3.4小结(重要)
  • 3.数据库实现(多对多)
    • 3.1多对多情况的引入
    • 3.2利用中间表实现多对多
    • 3.3数据库实现外键(多对多)
    • 3.4利用可视化工具(SQLyog)快速查看表之间的关系
    • 3.5小结

1.实体间常见关系

  • 购物网站中常有的实体一般包括:

    • 用户 订单 商品 分类
    • 这背后在数据库中都对应一张表来存放具体的数据,显然这些表之间不是孤立的,而是互相联系。
  • 常见关系:

    • 一对多:
      • 用户和订单:一个用户可以拥有多个订单,但是一个确定的订单只能属于一个用户
      • 分类和商品
    • 多对多:
      • 订单和商品:一个订单可以包含多个商品,而同一个商品可以出现在多个订单中
      • 学生和课程
    • 一对一:
      • 丈夫和妻子
  • ER图用来描述实体与实体之间的关系
    mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第1张图片

    • 实体用矩阵表示(一个实体对应一张表)
    • 属性用椭圆表示(属性对应字段)
    • 关系用菱形表示

2.数据库实现(一对多)

2.1一对多情况的引入

  • 假设现在有一张用户表和一个订单表,里面数据的具体关系如图:
    mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第2张图片
  • 上述表示张三拥有订单1和2,李四拥有订单3,但是数据库中显然不可能有划线的方式来表示关系,所以为了解决这个问题,引入外键。

2.2利用外键实现一对多

以一对多为例:

  • 在开发中,关系中的一方称之为主表或者一表,关系中的多方称之为多表或者从表,
    为了表示一对多的关系,一般会在多表的一方添加一个字段,字段名称自定义(建议:主表的名称_id)
    字段类型一般和主表的主键的类型保持一致,我们称这个字段为外键
  • 所以为了表示上述关系,我们需要在订单表中添加一个字段user_id
    mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第3张图片

2.3数据库实现(一对多)

2.3.1不设置外键的情况

  • 1.创建用户表
create table user(
id int primary key auto_increment,
name varchar(20)
);
  • 2.创建订单表
create table orders(
id int primary key auto_increment,
totalprice double,
user_id int
);
  • 3.初始化数据
insert into user values(3,'张三');
insert into user values(4,'李四');

insert into orders values(1,1314,3);
insert into orders values(2,1314,3);
insert into orders values(3,1314,4);

mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第4张图片

  • 4.删除user表中id=4的数据
    mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第5张图片
  • 这时候有个问题,订单表中的属于id=4的用户的订单现在属于谁呢? 所有前面的步骤并没有实现一个外键,我们只是厘清了表之间的关系,建立了相关的字段,但是这两张表仍然是独立的,还没有关联起来。

2.3.2为主(多)表和从(一)表之间添加外键

  • 为了保证数据的有效性和完整性,添加外键约束
  • 格式:alter table 多表名称 add foreign key(外键字段名称) references 一表名称(主键字段)
  • 例如:
alter table orders add foreign key(user_id) references user(id);

在这里插入图片描述

  • 这里出现了报错,就是因为刚才删除了id=4的数据导致现在的数据不是完整的,所以先添加一条id=4的数据到user表,再执行上述语句
insert into user values(4,'赵云');
alter table orders add foreign key(user_id) references user(id);

mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第6张图片

  • 现在再尝试删除id=4的记录
delete from user where id = 4;

在这里插入图片描述

  • 现在就无法删除了,报错信息大意是无法删除主表的一行,由于有外键约束。

2.3.3添加外键约束后的2个特点(重要)

  • 1.主表不能删除从表中已存在的数据(就是上述例子)
  • 2.从表中不能添加主表中不存在的数据

2.3.4小结(重要)

在开发中处理实体间一对多的关系时,往往在多表中添加一个外键字段,字段名为主表的名称_id,字段类型与主表的主键类型保持一致,然后在该外键字段上添加与主表的外键约束。

3.数据库实现(多对多)

在上述学习完成后,理解了一对多的外键实现,现在来学习多对多就相对简单了。

3.1多对多情况的引入

  • 在下图中,一个订单含有多个商品,一个商品属于多个订单,这是典型的多对多的关系。
    mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第7张图片

3.2利用中间表实现多对多

  • 多对多,在开发我们一般引入一张中间表,在中间表中存放两张表的主键,一般还会将这两个主键设置成中间表的联合主键,将多对多拆分成两个一对多,为了保证数据的有效性和完整性,在中间表上添加两个外键约束即可

3.3数据库实现外键(多对多)

  • 创建商品表
create table product(
id int primary key auto_increment,
name varchar(20),
price double
);
  • 创建中间表
create table orderitem(
oid int,
pid int
);
  • 添加外键约束
alter table orderitem add foreign key(oid) references orders(id);
alter table orderitem add foreign key(pid) references product(id);

mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第8张图片

3.4利用可视化工具(SQLyog)快速查看表之间的关系

mysql学习笔记(3):多表创建及多表之间的关系(外键约束)_第9张图片

3.5小结

开发中处理多对多:

  • 引入一张中间表,存放两张表的主键,一般会将这两个字段设置为联合主键,这样就可以将多对多的关系拆成两个一对多了
  • 为了保证数据的有效性和完整性需要在中间表上添加两个外键约束即可.

你可能感兴趣的:(MySQL,数据库)