首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我为字段设置fk约束时,KEY会自动创建?

为什么当我为字段设置fk约束时,KEY会自动创建?
EN

Stack Overflow用户
提问于 2022-02-13 14:51:05
回答 2查看 42关注 0票数 0

我使用以下语法创建表:

代码语言:javascript
复制
CREATE TABLE movies_genres 
(
    id BIGINT AUTO_INCREMENT,
    movie_id INT NOT NULL,
    genre_id INT NOT NULL,
    
    PRIMARY KEY (id),
    CONSTRAINT `fk_movie_id` FOREIGN KEY (movie_id) REFERENCES movies(id),
    CONSTRAINT `fk_genre_id` FOREIGN KEY (genre_id) REFERENCES genres(id),
    CONSTRAINT unique_id_pair UNIQUE(movie_id, genre_id)
);

但是,我看到了MySQL工作台中有关表的信息:

代码语言:javascript
复制
CREATE TABLE `movies_genres` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `movie_id` int NOT NULL,
  `genre_id` int NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_id_pair` (`movie_id`,`genre_id`),
  KEY `fk_genre_id` (`genre_id`),
  CONSTRAINT `fk_genre_id` FOREIGN KEY (`genre_id`) REFERENCES `genres` (`id`),
  CONSTRAINT `fk_movie_id` FOREIGN KEY (`movie_id`) REFERENCES `movies` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

为什么这一行代码会生成?

代码语言:javascript
复制
KEY `fk_genre_id` (`genre_id`)

我还看到额外的索引是我没有订购的.

带有额外索引的屏幕截图

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-13 15:04:04

https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html说:

MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。在“引用”表中,必须有一个索引,其中将外键列按相同顺序列为第一列。这样的索引在不存在的引用表上自动创建。

(强调地雷)

票数 1
EN

Stack Overflow用户

发布于 2022-02-15 23:14:28

(比尔给出了答案,这提供了另一个提示。)

去掉表中的id并更改为以下两个索引:

代码语言:javascript
复制
PRIMARY KEY (`movie_id`,`genre_id`),
KEY `fk_genre_id` (`genre_id`),

这将使您对这个多到多表的一些使用更快。它还会缩小表的大小。

(如果需要id )

由于单行删除和更新需要id,所以保留id,但请使用

代码语言:javascript
复制
PRIMARY KEY (id)
INDEX(`movie_id`, `genre_id`),
INDEX(`genre_id`, `movie_id`),

PK将继续使Delete/Update高效;其他两个索引将使多到多的连接高效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71101794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档