当我跑步时:
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。
答案 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`;