【发布时间】:2022-11-01 10:58:21
【问题描述】:
以下创建表 sql 代码未产生预期结果。
CREATE TABLE mentorships (
mentor_ID INT NOT NULL,
mentee_ID INT NOT NULL,
status VARCHAR(255) NOT NULL,
project VARCHAR(255) NOT NULL,
PRIMARY KEY (mentor_ID, mentee_ID, project),
CONSTRAINT fk1 FOREIGN KEY(mentor_ID) REFERENCES co_employees(id) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT fk2 FOREIGN KEY(mentee_ID) REFERENCES co_employees(id) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT mm_constraint UNIQUE(mentor_ID, mentee_ID));
运行代码后,当我在 phpmyadmin 中检查新表的索引时,我希望看到 fk1 以及下面屏幕截图中列出的其他索引。但正如您在屏幕截图中看到的,没有显示 fk1 索引。
关于为什么 fk1 索引没有显示或为什么没有创建它的任何想法?
【问题讨论】:
-
主键满足索引要求(mentor_id 上的索引),因此不会创建一个额外的显式索引。
-
来自dataedo.com/kb/tools/phpmyadmin/view-table-foreign-keys:要查看表的 FK,首先从对象资源管理器中选择表,然后转到结构选项卡,然后选择关系视图。请注意,在不同的版本中,它可能位于不同的位置。
-
请注意,在下面小提琴的第二组表中,PK 不再包含
mentor_id(我将其删除),因此会自动创建索引fk1b以满足外键约束的要求。 dbfiddle.uk/5b_pWQJA -
@JonArmstrong,由于主键还包含mentee_id,所以该主键是否也满足索引要求(mentee-id 上的索引)?如果是这样,那么这是否不会导致未在受指导者 ID 上创建显式索引?这将导致 fk2 未在索引中列出。但是,fk2 在索引中列出。
-
不能。只有 PK 的前导前缀列可用于满足该要求。 mentee_id 不是 PK 的前导前缀。如果该 FK 是复合(mentor_id,mentee_id),那么 PK 将满足要求,因为这些列是前导前缀并且顺序正确。
标签: mysql sql phpmyadmin