关于mysql设置外键,实现参照性完整性约束,以及workbench上的一个bug(?)
一、本次数据库中有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版本,使用命令行就没有问题,显示不能删除。
关于mysql设置外键,实现参照性完整性约束,以及workbench上的一个bug(?)的更多相关文章
- MySQL设置外键报错 #1452 - Cannot add or update a child row: a foreign key constraint fails 解决方法
MySQL数据库,当我尝试在A表中设置B表的主键为外键时,报出错误:#1452 - Cannot add or update a child row: a foreign key constraint ...
- mysql 设置外键约束时如何删除数据
Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新 ...
- mysql设置外键约束开启-关闭
在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint f ...
- mysql 设置外键 四大属性 CASCADE SET NULL NO ACTION RESTRICT 理解
CASCADE:主表delete.update的时候,从表会delete.update掉关联记录: SET NULL:主表delete.update的时候,从表会将关联记录的外键字段所在列设为null ...
- (转)mysql 无法设置外键的原因总结
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- MySQL中MyISAM与InnoDB区别及选择,mysql添加外键
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- MySQL基础 - 外键和约束
在工作中经常会遇到不少不同的观点,比如对于数据库来说那就是是否要设置外键,设置外键的理由自然不必多说,而不设置外键的理由多半为设置外键影响性能,但就目前工作来讲,还没有涉及到因为外键而引发的数据库瓶颈 ...
- MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)
MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作): a.创建2张表 create table userinfo(nid int not nul ...
- MySQL数据库--外键约束及外键使用
什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...
随机推荐
- 数据结构~Sqlserver索引使用的B树
B树相关概念 在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功:否则,一定可以 ...
- linux ubuntu 安装后没有root密码
终端中输入:sudo passwd root 此时重新设置原登录用户的密码. 设置成功后在终端继续输入: su root 则出现#号,原用户名得到root权限.此时可以进行超级用户操作.
- vs问题--------------标记为系统必备组建...
问题:标记为系统必备组建 要将程序集“D:\project\DMS\DMSGaeaService\TmsApplication\bin\Debug\Jns.Gaea.dll”标记为系统必备组件,必须对 ...
- ./sample_mnist: error while loading shared libraries: libnvinfer.so.4: cannot open shared object file: No such file or directory
Your library is a dynamic library. You need to tell the operating system where it can locate it at r ...
- 网易云课堂----java视频教程
http://study.163.com/course/introduction.htm?courseId=1003203062#/courseDetail?tab=1
- 如何使用HTML5的WebSocket实现网页与服务器的双工通信(一)
本系列服务端双工通信包括两种实现方式:一.使用Socket构建:二.使用WCF构建.本文为使用Socket构建服务端的双工通信,客户端同样使用Html5的WebSocket技术进行调用. 一.网页客户 ...
- ASP.NET Web API之消息拦截
要在action执行前后做额外处理,那么ActionFilterAttribute和ApiControllerActionInvoker就派上用场了.比如客户端请求发过来的参数为用户令牌字符串toke ...
- Sublime Text 3(3207)安装
Sublime Text 3207 下载 官网地址: Sublime Text 下载需要的类型 安装插件 安装插件管理器: 打开Sublime,点击Tools => Install Packag ...
- Web服务器软件 (Tomcat)
1.什么是服务器? 安装了服务器的软件的计算机 服务器软件:接收用户的请求(request),处理请求,做出响应. Web服务器软件:接收用户的请求(request),处理请求,做出响应,再Web服务 ...
- NodeJs 设置跨域后页面全部变成了源码在浏览器上显示
百度搜索跨域后得到 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin" ...