情境:
Parent table | id primary key, message_p
Child table | id primary key, parent_id foreign key, message_c
我在父表中有1行数据,在子表中有2行数据。我想测试FK关系强制执行的约束。然后我尝试从子表中删除外键,以便虽然子表有2行,但我可以继续删除父行:
alter table child
drop foreign key parent_id
然后我收到以下错误:
[1091 - 不能DROP'parent_id';检查列/密钥是否存在]
注意:
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的一般理解吗?
答案 0 :(得分:0)
您正尝试按列名删除外键约束,这就是您的代码不起作用的原因。
首先查询您的外键约束名称(使用show create table child
,因为您显示了密钥名称,例如track_ibfk_1
答案 1 :(得分:0)
如果您按照评论的方式尝试了所有内容(假设正确的表名,约束名,......),我认为没有理由说它不起作用。
但是,如果您有其他表将外键保存到父(或'成员'),这些约束可能阻止删除父条目吗?
无论如何,这是一个示例,显示删除外键实际上是有效的:
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