为什么我不能删除外键?

Why can't I drop a foreign key?

场景:

Parent table | id primary key, message_p
Child  table | id primary key, parent_id foreign key, message_c

我在父 table 中有 1 行数据,在子 table 中有 2 行数据。我想测试 FK 关系强制执行的约束。然后我尝试从子 table 中删除外键,这样即使子 table 有 2 行,我也可以继续删除父行:

alter table child 
drop foreign key parent_id

然后我收到以下错误:

[1091 - Can't DROP 'parent_id'; check that column/key exists]

备注:

show create table child

CREATE TABLE `track` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `member_id` int(11) NOT NULL,
 `title` varchar(50) DEFAULT NULL,
 `artist` varchar(50) DEFAULT 'TBA',
 `album` varchar(50) DEFAULT 'TBA',
 `genre` varchar(50) DEFAULT 'TBA',
 `dance_style` varchar(50) DEFAULT 'TBA',
 PRIMARY KEY (`id`),
 KEY `member_id` (`member_id`),
 CONSTRAINT `track_ibfk_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

我是否遗漏了我的查询或对 FK 的一般理解?

您正在尝试按列名删除外键约束,这就是您的代码不起作用的原因。

首先查询您的外键约束名称(使用 show create table child,因为您确实显示了键名称,例如 track_ibfk_1

如果您尝试了评论中的所有内容(假设 table 名称、约束名称等都是正确的),我看不出它为什么不起作用。

但是,如果您有其他 table 持有父条目(或 'member')的外键,也许这些约束会阻止删除父条目?

无论如何,这里有一个例子表明删除外键确实有效:

drop table if exists  testchild;
drop table if exists  test;

create table test(
id int primary key,
name varchar(50)
);

create table testchild(
childid int primary key,
reftotest int,
constraint reftotest_FK foreign key (reftotest) references test(id)
);

insert into test values (1, 'Jack'),  (2, 'Sam');
insert into testchild values (1, 1), (2, 2), (3, 1);

insert into testchild values (4,5); # will fail
delete from test where id = 1; # will fail

alter table testchild drop foreign key reftotest_FK;
insert into testchild values (4,5); # will not fail any more
delete from test where id = 1; # will not fail any more