首页 > 解决方案 > 为什么 MySQL 没有正确命名我的外键?

问题描述

请考虑我在 MySQL 8.0.22(在 InnoDB 数据库中)中运行的以下 SQL 代码:

CREATE TABLE `person` (
  `person_id` smallint unsigned NOT NULL AUTO_INCREMENT, 
  `name` varchar(128) NOT NULL,
  PRIMARY KEY (`person_id`)
);

CREATE TABLE `pet` (
  `pet_id` smallint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  PRIMARY KEY (`pet_id`)
);

ALTER TABLE `pet`
  ADD COLUMN `owner_id` smallint unsigned;

ALTER TABLE `pet`
  ADD CONSTRAINT `fk_pet_person`
  FOREIGN KEY `idx_fk_pet_person` (`owner_id`)
  REFERENCES `person` (`person_id`);

SHOW CREATE TABLE pet;

的输出SHOW CREATE TABLE pet是:

CREATE TABLE `pet` (
  `pet_id` smallint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `owner_id` smallint unsigned DEFAULT NULL,
  PRIMARY KEY (`pet_id`),
  KEY `fk_pet_person` (`owner_id`),
  CONSTRAINT `fk_pet_person` FOREIGN KEY (`owner_id`) REFERENCES `person` (`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

fk_pet_person在上面的输出中,当我idx_fk_pet_person在命令中指定它的名称时,为什么要命名 KEY ALTER TABLE?我怎样才能让它如此命名?

标签: mysqlsqlforeign-keyscreate-table

解决方案


您混淆了 FOREIGN KEY 和使其工作的 INDEX。请注意 - 代码中显示的约束定义中没有表达式名称(看起来像索引定义但不是)。

当没有合适的索引让约束起作用时,则自动创建该索引,并将约束名称用作索引名称。如果存在合适的索引,则不会发生自动创建。

如果您希望索引具有定义的名称,则必须在创建ALTER TABLE约束之前在单独的(子)语句中创建此索引:

ALTER TABLE `pet`
  ADD KEY `idx_fk_pet_person` (`owner_id`),
  ADD CONSTRAINT `fk_pet_person`
  FOREIGN KEY (`owner_id`)
  REFERENCES `person` (`person_id`);

或者

ALTER TABLE `pet`
  ADD KEY `idx_fk_pet_person` (`owner_id`);

ALTER TABLE `pet`
  ADD CONSTRAINT `fk_pet_person`
  FOREIGN KEY (`owner_id`)
  REFERENCES `person` (`person_id`);

DEMO


推荐阅读