首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 多对多表创建例子

基础概念

MySQL中的多对多关系是指两个表中的数据项之间存在多个对应关系。例如,学生和课程之间的关系,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。为了实现这种关系,通常需要创建一个中间表(也称为关联表或连接表),用于存储两个表之间的对应关系。

创建多对多表的例子

假设我们有两个表:students(学生)和courses(课程)。我们需要创建一个中间表student_courses来表示学生和课程之间的多对多关系。

表结构

  1. students 表
代码语言:txt
复制
CREATE TABLE students (
    student_id INT PRIMARY KEY AUTO_INCREMENT,
    student_name VARCHAR(100) NOT NULL
);
  1. courses 表
代码语言:txt
复制
CREATE TABLE courses (
    course_id INT PRIMARY KEY AUTO_INCREMENT,
    course_name VARCHAR(100) NOT NULL
);
  1. student_courses 表
代码语言:txt
复制
CREATE TABLE student_courses (
    student_id INT,
    course_id INT,
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

解释

  • students 表:存储学生的信息,包括student_idstudent_name
  • courses 表:存储课程的信息,包括course_idcourse_name
  • student_courses 表:存储学生和课程之间的对应关系,包括student_idcourse_id。这个表的主键是(student_id, course_id),表示每个学生和课程的组合是唯一的。同时,student_courses表通过外键与students表和courses表关联。

应用场景

多对多关系在许多实际应用中都很常见,例如:

  • 学生和课程的关系。
  • 订单和产品之间的关系。
  • 用户和角色之间的关系。

示例数据插入

代码语言:txt
复制
-- 插入学生数据
INSERT INTO students (student_name) VALUES ('Alice');
INSERT INTO students (student_name) VALUES ('Bob');

-- 插入课程数据
INSERT INTO courses (course_name) VALUES ('Math');
INSERT INTO courses (course_name) VALUES ('Science');

-- 插入学生和课程的对应关系
INSERT INTO student_courses (student_id, course_id) VALUES (1, 1); -- Alice 选修 Math
INSERT INTO student_courses (student_id, course_id) VALUES (1, 2); -- Alice 选修 Science
INSERT INTO student_courses (student_id, course_id) VALUES (2, 1); -- Bob 选修 Math

查询示例

查询某个学生选修的所有课程:

代码语言:txt
复制
SELECT c.course_name
FROM courses c
JOIN student_courses sc ON c.course_id = sc.course_id
WHERE sc.student_id = 1;

常见问题及解决方法

问题:插入数据时出现外键约束错误

原因:插入的数据违反了外键约束,例如尝试插入一个不存在的学生ID或课程ID。

解决方法:确保插入的数据在关联表中存在对应的记录。

代码语言:txt
复制
-- 确保学生ID和课程ID存在
INSERT INTO student_courses (student_id, course_id) VALUES (1, 1); -- Alice 选修 Math

问题:查询效率低下

原因:多对多关系查询可能涉及多个表的连接操作,导致查询效率低下。

解决方法:使用索引优化查询性能。

代码语言:txt
复制
-- 在关联表上创建索引
CREATE INDEX idx_student_courses ON student_courses(student_id, course_id);

参考链接

希望这些信息对你有所帮助!如果有更多问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MyBatis多表查询 - 一一 - 一 -

    MyBatis多表查询 - 一一 - 一 - 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询。...在上面我们已经准备好了 sql 表结构,在 sql 中具有 一一、一 三种关系。...# 多表关系 1. sql中 a. 一一 b. 一 : 用户 和 订单 c. : 用户 和 角色 2. mybatis中 a. 一一 b....(由二个一多组成) 查询的模型 用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用 查询的需求:查询用户同时查询出该用户的所有角色 在mybatis中实现,跟一多步骤是一样...一配置:使用+做配置 collection: property:关联的集合属性名 ofType:关联的集合元素类型(别名) 的配置跟一很相似

    3.3K10

    Mybatis的多表关联查询()「建议收藏」

    Mybatis的多表关联查询() 项目目录结构 实现 Role 到 User 业务要求 用户与角色的关系模型 编写角色实体类 编写 Role 持久层接口 实现的 SQL 语句 编写映射文件...测试代码 实现 User 到 Role 的 业务要求 编写用户实体类 编写 User持久层接口 实现的 SQL 语句 编写映射文件 测试代码 mybatis中的多表查询: 示例:用户和角色...、实现配置: 当我们查询用户时,可以同时得到用户所包含的角色信息 当我们查询角色时,可以同时得到角色的所赋予的用户信息 项目目录结构 实现 Role 到 User 多关系其实我们看成是双向的一多关系...分析: 相比上面的实现 Role 到 User ,主要变化就是sql语句的变化。...Process finished with exit code 0 以上就是Mybatis的多表关联查询()的全部内容。 看完如果你有帮助,感谢点赞支持! 加油! 共同努力!

    1.6K20

    SpringDataJpa多表查询 上(一

    表之间关系的划分 一一 一: 一的一方:主表 的一方:从表 外键:需要再从表上新建一列作为外键,他的取值来源于主表的主键 : 中间表:中间表中最少应该由两个字段组成,这两个字段做为外键指向两张表的主键...,又组成了联合主键 注意:一多关系可以看为两种: 即一一。...在数据库中实现两张表的关系 在实体类中描述出两个实体的关系 配置出实体类和数据库表的关系映射 JPA中的一 表关系建立 一多关系中,我们习惯把一的一方称之为主表,把的一方称之为从表。...在数据库中建立一的关系,需要使用数据库的外键约束。 配置文件 加入jpa配置 property <?xml version="1.0" encoding="UTF-8"?

    1.1K10

    mysql多表嵌套查询例子_mysql子查询嵌套规则

    分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): 1....SELECT语句的子查询 语法: 代码如下: SELECT … FROM (subquery) AS name … 先创建一个表: CREATE TABLE t1 (s1 INT, s2 CHAR(5)...想必Blogjava上的同志这些应该比较清楚,也不去详细介绍了。...希望本文所述大家MySQL数据库程序设计有所帮助。...您可能感兴趣的文章:MYSQL子查询和嵌套查询优化实例解析 MySQL子查询的几种常见形式介绍 mysql关联子查询的一种优化方法分析 PHP中实现MySQL嵌套事务的两种解决方案 mysql嵌套查询和联表查询优化方法

    3.4K30

    多表间的关系-一--一一-外键约束

    多表间的关系-一--一一-外键约束 1. 表关系概述 现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,用户和订单、订单和商品、学生和课程等等。...表和表之间的关系分成三种: 一一 (老公和老婆) 一 (部门和员工, 用户和订单) (学生和课程) 例如: 双11当天,马哥和东哥两个用户分别在淘宝上下了一些订单,已知马哥下了...一(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品 一建表原则: 在从表(多方)创建一个字段,指向主表(一方)的主键.我们把这个字段称之为外键. 3.... (m:n) 例如:老师和学生,学生和课程,用户和角色 多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。 4....一一 一一(1:1) 在实际的开发中应用不多.因为一一可以创建成一张表。

    6K20

    MySQL练习案例

    多表(二) 分析 一个订单中可以有多种商品 一种商品可以被添加到多个订单上。...如: 订单1中只买了一双皮鞋 订单2中买了一双皮鞋一条裤子 此时我们需要设计第三张表来描述 订单和商品的对应关系 商品和订单多关系,将拆分成两个一。...product商品表,为其中一个一的主表,需要提供主键pid order订单表,为另一个一的主表,需要提供主键oid orderitem中间表,为另外添加的第三张表,需要提供两个外键oid和pid...实现:订单和商品 数据准备  已有数据: CREATE DATABASE day04pre Use day04pre; ###创建分类表 CREATE TABLE category(   cid...20, 30); #6删除商品表的数据 -- 执行异常  因为这个id在第三张表中被使用了,因为约束的限制不能直接删除 DELETE FROM product WHERE pid = 1; 常见多多表设计

    1.5K30

    快速学习-Mybatis 多表查询之一

    第3章 Mybatis 多表查询之一 ? 3.1 一一查询(一) 需求 查询所有账户信息,关联查询下单用户信息。...注意: 因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一一查询。如果从用户信息出发查询用户下的账户信息则为一查询,因为一个用户可以有多个账户。...3.1.1.6 创建 AccountTest 测试类 public class AccountTest { private InputStream in; private SqlSession...for (Account au: accounts) { System.out.println(au); System.out.println(au.getUser()); } } 3.2 一查询...-- collection 是用于建立一中集合属性的对应关系 ofType 用于指定集合元素的数据类型 --> <collection property="accounts" ofType

    65920

    MySQL【四】---案例实战{拆分多表、外键创建等}

    1.准备数据 数据准备 create database jing_dong charset = utf8mb4; 创建一个商品goods数据表: create table goods( id int unsigned...goods_new on goods_new.cate_name=goods.cate_name and goods_new.max_price=goods.price;  如果出现相同的价格则需要,品牌进行排序...cate_name; **注意这里不用values select * from goods_cates;  之后把主表中的cate_name 改成新建的goods_cates的Id SET是SQL Server 中已经定义的变量赋值的方式...40) not null) select brand_name as name from goods group by brand_name; 需要注意:brand_name as name   需要与创建一致...foreign key 外键名称; 外键名称 alter table goods drop foreign key goods_ibfk_1; 在实际开发中,很少使用外键约束,会极大的降低表更新效率; mysql

    1.1K10

    JavaWeb——MyBatis框架之多表查询操作实战案例总结(MyBatis11查询,MyBatis1查询,MyBatis查询)

    目录 1 MyBatis的多表查询 1.1 MyBatis的11查询操作 1.2 MyBatis的1查询操作 1.3 MyBatis的查询操作 ---- 多表之间的关系,分为一一、一(...一)、,具体的不再赘述了,在数据库专栏-MySQL数据中有总结过。...1 MyBatis的多表查询 1.1 MyBatis的11查询操作 以一个用户和账户的示例说明多表查询的实现步骤: 【需求】:一个用户可有多个账户(多个账户也可属于一个用户),一个账户只能属于一个用户...; 4)实现配置:查询账户时,可以得到其对应的用户信息(11);查询用户时可同时得到其对应的所有账户信息(1)。...1.3 MyBatis的查询操作 ,以用户和角色的示例说明: 【需求】:一个用户可有多个角色,一个角色又属于多个用户; 【步骤】: 1)建立数据库表:用户表、角色表,使用中间表,实现多关系

    1.4K20

    创建servlet的4个步骤_映射不能一还是

    Servlet只需要覆盖无参数 init 就可以了 配置 Servlet自动加载:如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建...当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig...Enumeration getInitParameterNames():获取初始化参数的名称们 四,Web应用对象:ServletContext WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的....getFile() 2)获取字节码对象 Class 类名.class —- 静态方法 对象.getClass() —- 实例方法 举例说明:读取web工程中资源文件 在text工程中创建四个文件...1、在text工程根目录创建 1.txt 2、在WebRoot下创建2.txt 3、在WEB-INF下创建3.txt 4、在src下创建4.txt 使用带有main函数java程序(

    74010

    多关系表的创建方式、forms组件

    多关系表的三种创建方式 1.全自动,Django自动创建 class Book(models.Model): title = models.CharField(max_length=20)...) class Authors(models.Model): name = models.CharField(max_length=32) #好处:自始至终都没有操纵过第三张表,全部由orm创建...,内置了四个操作第三张表的方法add、remove、set、clear #不足:可扩展性差,自动创建的第三张表我发扩展和修改字段 2.纯手撸 class Book(models.Model):...跨表查询,不支持正反向查询的概念,不支持内置的第三张表操作的四个方法 3.半自动(推荐使用) 参数: through:指定第三张表关系 through_fields:指定第三张表中哪两个字段维护表与表之间的多关系...models.ForeignKey(to='Book') #好处:可以任意的添加和修改第三张表中的字段,支持orm跨表查询 #不足:不支持add、remove、clear、set forms组件 小例子

    5.2K00
    领券