【MySQL】多对多练习案例

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 【MySQL】多对多练习案例

多表(二)

  • 多对多

c20509302f614ed7abe07414ac6bb4df.png

  1. 分析

一个订单中可以有多种商品

一种商品可以被添加到多个订单上。

如:

订单1中只买了一双皮鞋

订单2中买了一双皮鞋一条裤子

此时我们需要设计第三张表来描述 订单和商品的对应关系


4c2ddea212bd4257a91a698fbe870414.png

  1. 商品和订单多对多关系,将拆分成两个一对多。
  2. product商品表,为其中一个一对多的主表,需要提供主键pid
  3. order订单表,为另一个一对多的主表,需要提供主键oid
  4. orderitem中间表,为另外添加的第三张表,需要提供两个外键oid和pid
  1. 实现:订单和商品

数据准备  已有数据:

CREATE DATABASE day04pre
Use day04pre;
###创建分类表
CREATE TABLE category(
  cid INT(32) PRIMARY KEY ,
  cname VARCHAR(100) #分类名称
);
# 商品表
CREATE TABLE product(
  pid INT PRIMARY KEY ,
  pname VARCHAR(50),
  price INT,
  flag VARCHAR(2), #是否上架标记为:1表示上架、0表示下架
  category_id INT,
  CONSTRAINT product_fk FOREIGN KEY (category_id) REFERENCES category (cid)
);
#分类
INSERT INTO category(cid,cname) VALUES('1','家电');
INSERT INTO category(cid,cname) VALUES('2','服饰');
INSERT INTO category(cid,cname) VALUES('3','化妆品');
#商品
INSERT INTO product(pid, pname,price,flag,category_id) VALUES('1','联想',5000,'1',1);
INSERT INTO product(pid, pname,price,flag,category_id) VALUES('2','海尔',3000,'1',1);
INSERT INTO product(pid, pname,price,flag,category_id) VALUES('3','雷神',5000,'1',1);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('4','JACK JONES',800,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('5','真维斯',200,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('6','花花公子',440,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('7','劲霸',2000,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('8','香奈儿',800,'1',3);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('9','相宜本草',200,'1',3);

新数据:

### 订单表
create table `order`(
  oid int PRIMARY KEY ,
  oname varchar(50)
);
### 订单项表
create table orderitem(
  oid int,-- 订单id
  pid int(50)-- 商品id
);
###---- 订单表和订单项表的主外键关系
ALTER TABLE orderitem ADD CONSTRAINT orderitem_order_fk FOREIGN KEY (oid) REFERENCES `order`(oid)
###---- 商品表和订单项表的主外键关系
alter table orderitem add constraint orderitem_product_fk foreign key (pid) references product(pid);


操作

#1 测试数据准备


--  向订单表中添加数据


三条数据:  1 订单1, 2  订单2,3  订单3


INSERT INTO `order` (oid,oname) VALUES(1,'订单1'),(2,'订单2'),(3,'订单3');


--向中间表添加数据(合理数据)


设定好的订单跟商品的关系


INSERT INTO orderitem(oid,pid) VALUES(1,1),(1,2),(1,3) ;


INSERT INTO orderitem(oid,pid) VALUES(2,1),(2,3),(3,3) ;


#需求


1.查询 二表联查 商品表和订单项表 显示订单的id和 商品的名称


期望展示效果如下格式:


525cf53838e94e41a970e9dba9b78e2a.png


SELECT oid ,pname  FROM product p ,orderitem od WHERE  p.pid = od.pid ORDER BY oid


2. 三表联查 , 查询三个表 商品表, 订单表,订单项表,显示订单编号,订单名称和该订单下所对应的商品


显示格式如下:


50f4cf72f6c740a2b8079e1724b660bf.png


SELECT o.oid AS 订单编号,o.oname AS 订单名,p.pname AS 商品名 FROM product p,orderitem od ,`order` o WHERE p.pid=od.pid AND od.oid =o.oid


观察如下语句的执行效果


#4删除中间表的数据


DELETE FROM orderitem WHERE pid=2  AND oid = 1;


#5向中间表添加数据(数据不存在) -- 执行异常 也就是说 要往中间表中插入的数据是受到两边表的限制


INSERT INTO orderitem(pid,oid) VALUES(20, 30);


#6删除商品表的数据 -- 执行异常  因为这个id在第三张表中被使用了,因为约束的限制不能直接删除


DELETE FROM product WHERE pid = 1;


  1. 常见多对多表设计
  1. 用户和角色

fb490b52ccf94349996adb3c16d41c10.png

  1. 角色和权限

49948ab2388d4596a6fa5b8385fa8129.png




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
30天前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
20 1
|
30天前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
26 1
|
30天前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
15 1
|
30天前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
21 1
|
30天前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
22 2
|
4月前
|
SQL 弹性计算 关系型数据库
服务器数据恢复-华为ECS云服务器mysql数据库数据恢复案例
云服务器数据恢复环境: 华为ECS云服务器,linux操作系统,mysql数据库(innodb引擎)。作为网站服务器使用。 云服务器故障: 在执行mysql数据库版本更新测试时,误将本应该在测试库上执行的sql脚本执行在生产库上了,生产库上的部分表被truncate,部分表内有少量数据被delete。 需要恢复被truncate的表以及被少量数据被delete的表。
服务器数据恢复-华为ECS云服务器mysql数据库数据恢复案例
|
30天前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
1月前
|
SQL 关系型数据库 MySQL
Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
【2月更文挑战第9天】Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
94 7
|
6天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
30天前
|
Java 数据库连接 mybatis
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
19 1