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,就有人出手,这门课的理论学习任重而道远。哈哈哈哈,以上就是此次的坑,如果有什么疑问或更好的想法,可以留言评论区哦。