首页 > 解决方案 > 删除外键 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”;检查列/键是否存在

标签: mysqlforeign-keys

解决方案


问题是您将索引与主键混淆了。

关键字 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,这样你就会立即注意到这个问题。


推荐阅读