Mysql 外键解释

在 MySQL 中,外键 (Foreign Key) 用于维护表与表之间的关系,保证数据的一致性和完整性。理解 一对一、一对多 和 多对多 关系,核心在于如何通过外键约束建立不同的表之间的关联。

一对一 (One-to-One)

  • 定义:一个表中的一条记录只能对应另一个表中的一条记录,反之亦然。
  • 实现方式:在其中一个表的主键作为外键引用另一个表的主键。
    示例
    用户表和用户详情表,每个用户只能有一条对应的详情记录。
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL
);

CREATE TABLE user_details (
user_id INT PRIMARY KEY,
address VARCHAR(255),
phone_number VARCHAR(20),
FOREIGN KEY (user_id) REFERENCES users(id)
);

特点

  • user_details.user_id 是 users.id 的外键。
  • 确保每个 user_details 记录与一个 users 记录严格一一对应。

一对多 (One-to-Many)
定义:一个表中的一条记录可以关联另一个表中的多条记录,但反过来不成立。
实现方式:在“多”的那一方添加外键,指向“单”的那一方的主键。
示例
一个用户可以有多篇文章,但一篇文章只能属于一个用户。

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL
);

CREATE TABLE posts (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
title VARCHAR(255),
content TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);

特点

  • posts.user_id 是 users.id 的外键。
  • 确保 posts 中的多条记录可以对应到 users 中的同一条记录。

多对多 (Many-to-Many)

  • 定义:一个表中的一条记录可以关联另一个表中的多条记录,同时反过来也成立。
  • 实现方式:通过中间表来实现,将两张表的主键作为中间表的外键。
    示例
    一个学生可以选修多门课程,一门课程可以有多个学生选修。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);

CREATE TABLE courses (
id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(100)
);

CREATE TABLE student_courses (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);

特点

  • student_courses 是中间表,包含 student_id 和 course_id 两列,分别关联 students 和 courses 表。
  • PRIMARY KEY (student_id, course_id) 保证了一个学生不能重复选修同一课程。

总结
一对一:主键对主键,或唯一键。
一对多:主键对外键,外键在“多”的那一方。
多对多:通过中间表管理两表之间的多对多关系。

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道