Day13 Mysql多表关系

一、外键

  • 现在我们有两种张表“分类表”和“商品表”,为了表明商品属于哪个分类,通常情况下,我们将商品表上添加一列,用于存放分类cid的信息,此列称为:外键
    在这里插入图片描述
    在这里插入图片描述
  • 此时,
    “分类表category”称为:主表,cid称为主键。
    ”商品表products“称为:从表,category_id称为外键。

    我们通过主表的主键和从表的外键来描述主外键关系,呈现的就是一对多关系。
  • 外键特点:
    从表外键的值是对主表主键的引用。
    从表外键类型,必须与主表主键类型一致
  • 声明外键约束

语法:alter table 从表 add [constraint] [外键名称] foreign key(从表外键字段名) references 主表(主表的主键);
其中 [外键约束] 用于删除外键约束的,一般建议“_fk"结尾
alter table 从表 drop foregin key 外键名称;

  • 使用外键目的:
    保证数据完整性

二、表与表之间的关系

表与表之间的关系,说的就是表与表数据之间的关系。

  1. 一对一关系:(了解)
  • 在实际开发中应用不多,因为一对一可以创建成一张表。
  1. 一对多关系:
  • 常见实例:客户和订单,分类和商品,部门和员工。
  • 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
    在这里插入图片描述
  1. 多对多关系:
  • 常见实例:学生和课程,商品和订单,人和角色。

  • 多对多关系建表原则:需要创建第三张表,中间表至少两个字段,这两个字段分别作为外键指向各自一方的主键。(就是将一个多对多拆分成两个一对多)
    在这里插入图片描述

  • 两张表都是主表,第三张表为从表,提供两个字段,都是外键。

三、创建表实现

1、一对多:分类和商品

   #创建数据库
   create database web01;

   #使用数据库
   create web01;

   #创建分类表
   create table category(
      cid int primary key auto_increment, #主表的主键
      cname varchar(20)   #分类名称
   );

   #商品表
   create table products(
      pid int primary key auto_increment,
      name varchar(20),
      price double
   );

   #添加外键字段category_id
   alter table products add category_id int;

   #添加外键约束
   alter table products add foreign key(category_id) references     category(cid);

2、多对多:订单和商品

   #订单表
   create table orders(
      oid int primary key auto_increment,
      totalprice double #总计
   );

   #订单项表
   create table orderitem(
      oid int primary key, #订单id
      pid int primary key  #商品id
   );

   #订单表和订单项表的主外键关系
   alter table orderitem add foreign key(oid) references orders(oid);

   #商品表和订单项表的主外键关系
   alter table orderitem add foreign key(pid) references products(pid);

总结:

  • 添加数据:主表:随意添加;从表:受主表限制,不能添加主表中不存在的数据。
  • 删除数据:主表:如果某一行的数据受到从表的依赖,在从表中已经使用,则不能删除,;从表:随意删除。
  • 要想删除主表中与从表有关联关系的数据,可以这么做:
    1.解除主从表的约束关系
    2.先删除从表中与主表有关系的数据,再删除主表中的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值