mysql多对多表怎么建
时间 : 2023-03-14 05:44:01声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在MySQL中,多对多关系可以通过中间表(也称为连接表或交叉表)进行建立和管理。下面我们来介绍如何建立多对多关系的中间表。

1. 创建主表和从表

首先,我们需要创建包含数据的主表和从表。在多对多关系中,主表和从表都是需要互相关联的。

例如,我们可以创建一个包含商品信息的主表`products`,另一个包含标签信息的从表`tags`,它们之间是通过标签和商品之间的多对多关系来关联的。

CREATE TABLE `products` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(255) NOT NULL,

`description` TEXT NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `tags` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(255) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 创建中间表

接下来,我们需要创建用来保存主表和从表之间多对多关系的中间表。中间表应该包含的字段是主表和从表的主键,以及其他可能需要的字段。

例如,我们可以创建一个中间表`product_tag`,它用来记录每个商品对应的标签。

CREATE TABLE `product_tag` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`product_id` INT(11) NOT NULL,

`tag_id` INT(11) NOT NULL,

PRIMARY KEY (`id`),

KEY `product_id` (`product_id`),

KEY `tag_id` (`tag_id`),

CONSTRAINT `product_tag_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `product_tag_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在中间表中,我们使用了多个外键来约束主表和从表,以确保在删除或更新记录时,与之相关的中间表记录也会被删除或更新。

3. 插入数据

最后,我们需要向主表和从表中插入数据。以商品和标签为例,我们可以向`products`表中插入一些产品,如下所示:

INSERT INTO `products` (`name`, `description`) VALUES

('iPhone 12', '最新的苹果智能手机'),

('MacBook Pro', '苹果公司的笔记本电脑'),

('AirPods Pro', '苹果公司的无线耳机');

同样的,我们也需要向`tags`表中插入一些标签。

INSERT INTO `tags` (`name`) VALUES

('手机'),

('电脑'),

('智能硬件');

最后,我们需要将商品和标签之间的多对多关系保存到中间表中。

INSERT INTO `product_tag` (`product_id`, `tag_id`) VALUES

(1,1),

(2,2),

(3,3),

(1,3),

(2,1);

在上面的例子中,我们向`product_tag`表中插入了商品和标签的多对多关系,使得每个商品和多个标签相关联。

这样,我们就通过中间表成功地建立了多对多关系。

MySQL多对多表是指两个或多个表之间通过一个中间表来建立关系。这种关系在应用程序中比较常见,例如,在一个电子商务应用程序中,一个订单可以对应多个商品,同时一个商品又可以属于多个订单。这就是一个典型的多对多关系。

下面是建立一个多对多关系的示例。假设我们有两个表:`students`和`courses`,一个学生可以选择多门课程,同时一门课程也可以被多名学生选择。我们需要建立一个中间表`student_course`来存储学生和课程之间的关系。

首先,我们需要建立`students`表和`courses`表,如下所示:

CREATE TABLE students (

id INT PRIMARY KEY,

name VARCHAR(50) NOT NULL

);

CREATE TABLE courses (

id INT PRIMARY KEY,

name VARCHAR(50) NOT NULL

);

接下来,我们创建`student_course`表来存储学生和课程之间的关系:

CREATE TABLE student_course (

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)

);

在上面的SQL语句中,我们创建了一个名为`student_course`的表,用来存储学生和课程之间的关系。表中有两个列:`student_id`和`course_id`。这两个列都是整数类型,用来存储学生和课程的ID。

此外,我们还声明了这个表的主键是`(student_id, course_id)`,表示这两个列的组合必须唯一。同时,我们还为`student_id`和`course_id`列分别创建了外键,分别引用了`students`表和`courses`表的主键。

这样,我们就建立了一个多对多的关系。当我们需要获取某个学生选择的所有课程时,可以使用以下SQL语句:

SELECT courses.name

FROM student_course

JOIN courses

ON student_course.course_id = courses.id

WHERE student_course.student_id = 1;

当我们需要获取某门课程被哪些学生选择时,可以使用以下SQL语句:

SELECT students.name

FROM student_course

JOIN students

ON student_course.student_id = students.id

WHERE student_course.course_id = 1;

通过上面的示例,我们可以看到,通过中间表来建立多对多关系,可以更加灵活地管理数据,提高数据的存储效率。