一、本次数据库中有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版本,使用命令行就没有问题,显示不能删除。