【MySQL】多对多练习案例

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介: 【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




相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
191 3
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
1148 0
案例剖析:MySQL唯一索引并发插入导致死锁!
|
SQL 关系型数据库 MySQL
案例剖析,MySQL共享锁引发的死锁问题!
案例剖析,MySQL共享锁引发的死锁问题!
224 0
|
消息中间件 关系型数据库 MySQL
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
879 0
|
12月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
存储 SQL 关系型数据库
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
329 25
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
635 5
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。

推荐镜像

更多