解决在Mysql上删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists

1.问题起因

由于作业题目要求删除学生课程表的外键约束,于是我执行以下语句删除其外键约束

alter table sc drop foreign key cno

然后Navicat提示这个错误。

2.错误分析

这句话翻译过来就是让我检查一下外键是否存在,我就很纳闷,是我创建外键的时候名字记错了吗?然后我就查了一下创建学生课程表的细节

查询语句

show create table sc
CREATE TABLE `sc` (
  `Sno` char(9) NOT NULL,
  `Cno` char(4) NOT NULL,
  `Grade` smallint DEFAULT NULL,
  PRIMARY KEY (`Sno`,`Cno`),
  KEY `Cno` (`Cno`),
  CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`Cno`) REFERENCES `course` (`Cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

观察此表,仔细揣摩发现了不得了的玩意儿"CONSTRAINT `sc_ibfk_2` ",我在创建此表的时候并未写此关键字。莫不是Navicat在我创建此表的时候自动创建一个限制名,为了验证猜想,我创建了测试表

3.验证猜想

--1.创建测试学生表--
create table stu(
	sid char(10),
	sname varchar(20),
	primary key(sid)
	);
--2.创建测试课程表--
create table cu(
	cid char(4),
	cname varchar(10),
	primary key(cid)
);
--3.创建关系表--
create table demo(
	sid char(10),
	cid char(4),
	primary key(sid,cid),
	foreign key(sid) references stu(sid),
	foreign key(cid) references cu(cid)
);

为了验证猜想,在Navicat查一下创建demo的细节

CREATE TABLE `demo` (
  `sid` char(10) NOT NULL,
  `cid` char(4) NOT NULL,
  PRIMARY KEY (`sid`,`cid`),
  KEY `cid` (`cid`),
  CONSTRAINT `demo_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `stu` (`sid`),
  CONSTRAINT `demo_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `cu` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

果不然,这个老六偷偷摸摸的创建一个限制名。现在我们删除这个限制名来删除demo表的外键试试

4.见证奇迹

执行语句

alter table demo drop foreign key demo_ibfk_1

然后我们可以看到Navicat的示,删除外键成功啦!

这也就是说我们以后在Navicat上删除外键,就需要找到这个限制名然后直接将其删除即可。

5.进一步猜想

我在想这是不是这个创建限制名的操作是不是Navicat独有的,然后不甘心的在Dos命令下创建一个新的关系表,然后一查创建的细节

我滴妈呀,这结果跟Navicat一样,所有就证明了,这是mysql编译器搞的鬼。也就是说,以后只要我们想要执行mysql的外键约束删除操作,只需要查看此表的创建细节,找到这个限制名,然后将其删除即可。

6.结语

在学习数据库系统概论这个课程上,书上的一些操作案例,mysql语句有时候在Navicat上并不会执行成功。这就造成了一些坑,但是无所谓,只要有bug,就有人出手,这门课的理论学习任重而道远。哈哈哈哈,以上就是此次的坑,如果有什么疑问或更好的想法,可以留言评论区哦。

 

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值