一、本次数据库中有student,course,sc表,其设置情况

 1 -- 创建course表
 2 CREATE TABLE `course` (
 3   `cno` varchar(3) NOT NULL,
 4   `cname` varchar(12) DEFAULT NULL,
 5   `lhour` int(11) DEFAULT NULL,
 6   `credit` int(11) DEFAULT NULL,
 7   `semester` varchar(2) DEFAULT NULL,
 8   PRIMARY KEY (`cno`)
 9 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
10 
11 -- 创建student表
12 CREATE TABLE `student` (
13   `sno` varchar(6) NOT NULL,
14   `sname` varchar(6) DEFAULT NULL,
15   `sex` varchar(2) DEFAULT NULL,
16   `bdate` datetime DEFAULT NULL,
17   `dept` varchar(8) DEFAULT NULL,
18   `classno` varchar(4) DEFAULT NULL,
19   PRIMARY KEY (`sno`)
20 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
21 
22 -- 创建sc表
23 CREATE TABLE `sc` (
24   `sno` varchar(6) NOT NULL,
25   `cno` varchar(3) NOT NULL,
26   `grade` int(11) DEFAULT NULL,
27   PRIMARY KEY (`sno`,`cno`),
28 -- 这里直接插入外键
29   foreign  KEY (`sno`) references `student`.`student`(`sno`),
30   foreign  KEY (`cno`) references `student`.`course`(`cno`)
31 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是创建表时直接插入外键,也可以创建表后再对sc表插入外键

1 -- 建表之后再对表中添加外键
2 alter table `sc`
3 add foreign key (`sno`)
4 references `student`(`sno`);
5 
6 alter table `sc`
7 add foreign key (`cno`)
8 references `course`(`cno`);

二、验证其参照完整性。这个时候,我们再对sc表添加student表里没有的sno,course表没有的cno,都不被允许。删除student表或course表中sc中出现过的sno(cno)的行和列时,也不被允许。

例,删除student表

 

三、workbench的bug(?)

在workbench进行删除操作的时候,即使设置了外键,也是可以删除表的

这个时候再加载数据就会有问题,在左上方点刷新数据库按钮的时候,就会出现数据加载有问题错误

实际上设置外键时就不能只删除主表了,这不符合参照完整性约束,会出bug,workbench编译就没有考虑到这个;

并且这不是我的mysql版本的问题,我的是8.0版本,使用命令行就没有问题,显示不能删除。