【问题标题】:An index is not being created as expected when running some CREATE TABLE sql code运行某些 CREATE TABLE sql 代码时未按预期创建索引
【发布时间】: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


【解决方案1】:

为了澄清上述 cmets 中提出的观点,以下是手册中的内容:

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

在引用表中,必须有一个列出外键列的索引作为第一列以相同的顺序。这样的索引是在引用表上自动创建的如果它不存在.

(强调我的)

在您的情况下,“参考表”是mentorships,您在其中定义外键的表。

手册中的这一陈述与 Jon Armstrong 的观点一致:主键满足 mentor_id 上外键的索引要求,因为这是主键索引中的第一列。但它不满足mentee_id 上的外键索引,因为那不是第一列。因此它必须只为mentee_id 创建一个新索引。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多