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