一、本次数据库中有student,course,sc表,其设置情况
-- 创建course表
CREATE TABLE `course` (
`cno` varchar(3) NOT NULL,
`cname` varchar(12) DEFAULT NULL,
`lhour` int(11) DEFAULT NULL,
`credit` int(11) DEFAULT NULL,
`semester` varchar(2) DEFAULT NULL,
PRIMARY KEY (`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建student表
CREATE TABLE `student` (
`sno` varchar(6) NOT NULL,
`sname` varchar(6) DEFAULT NULL,
`sex` varchar(2) DEFAULT NULL,
`bdate` datetime DEFAULT NULL,
`dept` varchar(8) DEFAULT NULL,
`classno` varchar(4) DEFAULT NULL,
PRIMARY KEY (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建sc表
CREATE TABLE `sc` (
`sno` varchar(6) NOT NULL,
`cno` varchar(3) NOT NULL,
`grade` int(11) DEFAULT NULL,
PRIMARY KEY (`sno`,`cno`),
-- 这里直接插入外键
foreign KEY (`sno`) references `student`.`student`(`sno`),
foreign KEY (`cno`) references `student`.`course`(`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这是创建表时直接插入外键,也可以创建表后再对sc表插入外键
-- 建表之后再对表中添加外键
alter table `sc`
add foreign key (`sno`)
references `student`(`sno`); alter table `sc`
add foreign key (`cno`)
references `course`(`cno`);
二、验证其参照完整性。这个时候,我们再对sc表添加student表里没有的sno,course表没有的cno,都不被允许。删除student表或course表中sc中出现过的sno(cno)的行和列时,也不被允许。
例,删除student表
三、workbench的bug(?)
在workbench进行删除操作的时候,即使设置了外键,也是可以删除表的
这个时候再加载数据就会有问题,在左上方点刷新数据库按钮的时候,就会出现数据加载有问题错误
实际上设置外键时就不能只删除主表了,这不符合参照完整性约束,会出bug,workbench编译就没有考虑到这个;
并且这不是我的mysql版本的问题,我的是8.0版本,使用命令行就没有问题,显示不能删除。