当前位置: 首页 > news >正文

mysql建表一对多--多对多之间的外键关联

每一个表都要有一个主键

好的!我用简单易懂的方式解释这两个概念:


每个用户都有很多消息

每条消息只被一个人单独占有

1. 外键关联(Foreign Key)—— 父子关系(一对多)

是什么:一个表中的字段(外键)指向另一个表的主键,类似于“身份证号”引用。
目的:建立两个表之间的父子关系(一对多),确保数据的一致性。

例子:消息表(messages)和用户表(users

• 用户表(父表):

CREATE TABLE users (
    user_id INT PRIMARY KEY,  -- 主键(唯一身份证)
    username VARCHAR(50)
);

• 消息表(子表):

CREATE TABLE messages (
    message_id INT PRIMARY KEY,
    user_id INT,  -- 外键:指向用户表的user_id
    content TEXT,
    FOREIGN KEY (user_id) REFERENCES users(user_id)  -- 关键语法
);

效果
• 每条消息必须属于某个存在的用户(user_id必须在users表中存在)。
• 如果尝试删除一个用户,但该用户还有消息,数据库会阻止删除(除非设置级联删除)。


一个用户可以加入多个聊天室

一个聊天室可以包含多个用户

2. 关联表(Association Table)—— 多对多关系

是什么:一个中间表,专门用来描述两个表之间的多对多关系
目的:解决“一个用户加入多个聊天室,一个聊天室包含多个用户”这类问题。

例子:用户表(users)和聊天室表(chat_rooms

• 用户表:

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50)
);

• 聊天室表:

CREATE TABLE chat_rooms (
    room_id INT PRIMARY KEY,
    room_name VARCHAR(50)
);

关联表user_rooms):

CREATE TABLE user_rooms (
    user_id INT,
    room_id INT,
    PRIMARY KEY (user_id, room_id),  -- 联合主键
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (room_id) REFERENCES chat_rooms(room_id)
);

效果
• 用户A(user_id=1)可以加入聊天室1和聊天室2。
• 聊天室1(room_id=1)中可以包含用户1、用户2、用户3。
• 查询用户1加入的所有聊天室:
sql SELECT chat_rooms.* FROM user_rooms JOIN chat_rooms ON user_rooms.room_id = chat_rooms.room_id WHERE user_rooms.user_id = 1;


3. 类比现实生活

外键关联:像快递单上的“收件人电话”,必须是一个真实存在的号码。
关联表:像学校的“选课表”,记录哪个学生(student_id)选了哪门课(course_id)。


4. 常见误区

误区:试图在一个表的字段中存储多个ID(如用逗号分隔1,3,5),这是错误做法!
正确做法:用关联表(如user_rooms)存储多对多关系。


总结

外键关联:用于一对多(如一个用户发多条消息)。
关联表:用于多对多(如用户和聊天室)。
• 数据库表是“二维表格”,不能嵌套,但通过这两种方式可以实现数据关联!

相关文章:

  • 202529 | RocketMQ 简介 + 安装 + 集群搭建 + 消费模式 + 消费者组
  • DHCP中继
  • 安卓关机和重启源码流程
  • 【HDFS入门】Hadoop 2.0+ HDFS核心架构深度解析:高可用设计揭秘
  • C. Good Subarrays
  • 操作系统基础:07 我们的任务
  • MySQL-锁
  • leetcode 3508 设计路由器 模拟 深拷贝 二分 bound
  • (即插即用模块-特征处理部分) 三十二、(TGRS 2024) MDAF 多尺度双表示对齐过滤器
  • 深入解析TCP拥塞控制机制:从原理到现代算法优化
  • 如何在Agent中设置Memory
  • 【数学建模】佳点集(Good Point Set)在智能优化算法中的应用与实现
  • ChatGPT-如何让AI写作不那么生硬!
  • 学习笔记九——Rust所有权机制
  • 探索 MCP 和 A2A 协议: 本质上新协议都基于 HTTP的
  • 【Spring底层分析】Spring IoC
  • RocketMQ 安装时启动一闪而过 start mqnamesrv.cmd
  • 插值算法 - 最近邻插值实现
  • 用python写一个简单的射击游戏
  • skynet.socket 完整通信流程
  • 秦洪看盘|小市值股领涨,A股交易情绪复苏
  • 外交部:将持续便利中外人员往来,让“中国游”金字招牌更加闪耀
  • 国新办10时将举行新闻发布会,介绍4月份国民经济运行情况
  • 上昆“学馆制”10年,完成300出折子戏和20台大戏传承
  • C919上海虹桥-深圳航线开通,东航今年计划再接收10架C919
  • 上海天文馆走进徐家汇书院,XR沉浸式天文科普体验再推力作