当Key_name与Column_name不匹配时,Drop Foreign Key不起作用

时间:2016-10-12 18:19:36

标签: mysql foreign-keys

当我跑步时:

ALTER TABLE `example` DROP FOREIGN KEY `example_configs_user_email_foreign`;

它运行没有错误,但外键不会被删除。当我查看表索引时,它仍显示:

Key_name: example_configs_user_email_foreign
Column_name: user_email
Non_unique: 1

我的表:

CREATE TABLE `example` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `url_slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email_address` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  PRIMARY KEY (`id`),
  UNIQUE KEY `example_configs_url_slug_unique` (`url_slug`),
  KEY `example_configs_user_email_foreign` (`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我错过了什么?我需要做什么来放弃FK。

2 个答案:

答案 0 :(得分:1)

create schema test8484a;
use test8484a;

create table sometable
(   id int auto_increment primary key,
    user_email varchar(255) not null COLLATE utf8_unicode_ci NOT NULL,
    key `keyname8282`(user_email)
)engine=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `example` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `url_slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `user_email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  PRIMARY KEY (`id`),
  UNIQUE KEY `example_configs_url_slug_unique` (`url_slug`),
  CONSTRAINT `example_configs_user_email_foreign` 
      FOREIGN KEY (`user_email`) 
      REFERENCES sometable(`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

show create table example;
CREATE TABLE `example` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `url_slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
   `user_email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `example_configs_url_slug_unique` (`url_slug`),
   KEY `example_configs_user_email_foreign` (`user_email`), -- created on your behalf
   CONSTRAINT `example_configs_user_email_foreign` FOREIGN KEY (`user_email`) REFERENCES `sometable` (`user_email`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- find the FK name above in case some name mangling occurred

alter table example drop foreign key example_configs_user_email_foreign;
show create table example;
CREATE TABLE `example` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `url_slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
   `user_email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `example_configs_url_slug_unique` (`url_slug`),
   KEY `example_configs_user_email_foreign` (`user_email`) -- residue remains ***********
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

-- cleanup:
drop schema test8484a;

使用show create table theTableName检查剩余的名称和索引。注意在"掉落FK"。

之后残留的辅助指数

最初创建FK后,将创建子表中的Helper索引。在下降FK后,该指数仍在那里。

从标题为Using FOREIGN KEY Constraints的手册页

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会在引用表上自动创建索引   存在。如果您创建,可能会在以后静默删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。

答案 1 :(得分:0)

结果我除了FK约束之外还需要删除索引。

ALTER TABLE `example` DROP FOREIGN KEY `example_configs_user_email_foreign`;
ALTER TABLE `example` DROP INDEX `example_configs_user_email_foreign`;