mysql - 删除外键 MySQL 不存在
问题描述
我在 MySQL 中有一个这样的表(这是使用 show create table user_org_contacts 返回的):
CREATE TABLE `user_org_contacts` (
`user_org_contacts_id` int(11) NOT NULL AUTO_INCREMENT,
`from_user_id` int(11) DEFAULT NULL,
`to_org_user_id` int(11) DEFAULT NULL,
`suggested_vacancy_id` int(11) DEFAULT NULL,
`contact_date` datetime NOT NULL,
`message` text,
PRIMARY KEY (`user_org_contacts_id`),
KEY `FK_Reference_53` (`from_user_id`),
KEY `FK_Reference_54` (`to_org_user_id`),
KEY `FK_Reference_55` (`suggested_vacancy_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin1
我注意到我的 FK_Reference_54 错误并指向错误的表。所以我想用正确的FK来改变这个。
这是我尝试过的:
ALTER TABLE `user_org_contacts`
DROP FOREIGN KEY `FK_Reference_54`;
ALTER TABLE `user_org_contacts`
ADD CONSTRAINT `FK_Reference_54`
FOREIGN KEY (`to_org_user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE;
这会产生以下错误:
1091 - 无法删除“FK_Reference_54”;检查列/键是否存在
解决方案
问题是您将索引与主键混淆了。
关键字 KEY 实际上是向您显示索引,而主键使用关键字 CONSTRAINT ... FOREIGN KEY ...
例子:
CONSTRAINT `FK_name` FOREIGN KEY (`current_field_name`)
REFERENCES `external_table_name` (`external_field_name`) ON DELETE CASCADE ON UPDATE CASCADE
所以在你的情况下,如果你想删除你的 INDEX 你只需要调用这个查询
ALTER TABLE `user_org_contacts`
DROP INDEX `FK_Reference_54`;
下次我建议你为 mysql 使用一些 UI,比如 mysql workbench,这样你就会立即注意到这个问题。
推荐阅读
- python - python-pptx:更新现有未链接数据的更改数据
- java - 如何使用 Mockito 和 Spring 获得模拟服务的价值
- mongodb - MongoDB:如何检查副本集中的性能?
- python - 无法加载超过 1 个指标的 keras 模型
- json - Flutter JSON 从字符串转换或如何从对话流中获取 JSON 数据
- angular - Angular SSR 不断加载并因 ERR_EMPTY_RESPONSE 而失败,而命令行上没有任何控制台错误
- npm - 没有更多参数的“npm install -g”到底是做什么的?
- javascript - 如何使用 Transform 和 Transition 将 3 个小节 (⚊) 转换为“-X”
- linux - 如何在树莓派中重置环境变量?
- gitlab - 在 GitLab GUI 中启用预提交挂钩