mysql - 为什么 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
?我怎样才能让它如此命名?
解决方案
您混淆了 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`);
推荐阅读
- amazon-web-services - AWS 网络负载均衡器 CloudFormation IP
- javascript - 如何使用valueChange() 和snapshotChanges() 方法获取数据?
- node.js - 节点从 axios post 接收 post json
- database-design - 总体最佳实践:多个表还是一个类型 ID?
- arrays - 如何将 [45,32,56] 或 "45,32,56" 转换为 42,32,56?
- javascript - 具有相同日期的 Highchart 组图表点
- python - 在列表理解中使用“else np.nan”
- python - 在 Python appium 中返回 self.find_element (by = By.ID, value = id_) 和异常错误
- javascript - 表达式周围的无端括号
- python-3.x - 如果我只有操作名称,如何在 python 中获取云语音 api 响应?