文档章节

mysql外键约束

itviewer
 itviewer
发布于 2015/05/24 00:11
字数 601
阅读 149
收藏 0

概念

外键是我们经常使用的数据库约束方式。它保证了子表上的特定索引列取值一定与父表列(主键列)相一致对应。而且保证在子表没有对应子记录的情况下,父表数据才能删除。应该说,外键是实现数据库完整性、消除潜在脏数据风险的重要手段。

 

在使用外键的时候,我们经常会要求在子表外键列上建立索引。


如下图,在admin表里建立外键,并设置参考(phpmyadmin里叫做链接到)表的字段为 删除时 NO ACTION时,是指

当参考(链接到)的表发生删除操作时,如果admin表存在和user表里字段相等的记录,则禁止参考的表进行删除操作。

但如果是删除admin表里的记录,user表如果没有对应约束的话,则会删除admin里的记录,user表里的记录不受影响

其关系类似父子关系,外键参考的表属于父亲,当前外键的表属于孩子,删除时孩子不会对父亲产生影响。

另外,当更新(ON UPDATE)约束如果没有设置时,默认为RESTRICT(phpmyadmin不显示),如果想在admin表里直接插入一条user里没有记录的记录,则会提示“can not add or delete a child row”错误,即当添加数据时,参考的表里必须有对应的记录才可操作。


从以上关系可以推断出 外键约束 不能双向约束,只能单向,比如,如果想实现user表里删除记录时对应删除admin表,同时删除admin表记录时对应删除user表中的记录,是不可能的

使用

一个表里多个字段对参考表里同一字段建立外键关联貌似不可用

外键的使用有利有弊,好处是可以减轻数据库垃圾的产生,弊端是需要特定数据库支持,带来移植不便,再就是一些确实需要约束的关联不能简单的通过mysql自己实现,必须要在业务上进行提示处理,比如删除一个栏目时,栏目下的文章不能简单的通过外键约束全部删除,必须要手动处理。

© 著作权归作者所有

共有 人打赏支持
itviewer
粉丝 16
博文 218
码字总数 44686
作品 0
海淀
技术主管
私信 提问
SQL 的约束

说明:文章所有内容均截选自用户“实验楼包工头”发布在实验楼上的教程【MySQL 基础课程】,想要详细的学习SQL,点击教程即可免费学习了;未经允许,禁止转载; 约束是一种限制,它通过对表的...

实验楼
2017/11/22
0
0
MySQL学习笔记一

MySQL目录结构 配置my.ini MySQL5.7的my.ini位于ProgramDataMySQLMySQL Server 5.7目录下(可能有的版本的my.ini就在安装目录下),该该目录下还有一个data目录存放我们的创建的数据库。 打开...

Aaron_DMC
2016/12/16
27
0
MySQL常见建表选项及约束

一、CREATE TABLE 选项 1、在定义列的时候,指定列选项 1)DEFAULT :定义列的默认值   当插入一个新行到表中并且没有给该列明确赋值时,如果定义了列的默认值,将自动得到默认值 ;如果没...

jjjyyy66
2017/05/15
0
0
三、数据表的基本操作

3.1、创建数据表 创建数据表指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(实体完整性、引用完整性、域完整性)约束的过程。 创...

运维菜鸟丶
2017/07/30
0
0
Mysql索引与键

0.主键与索引的不同 主键在物理层面上只有两个用途: 惟一地标识一行;作为一个可以被外键有效引用的对象。 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着...

a_liujin
2016/06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ubuntu美化记,-修改皮肤,安装工具。

事情由来 最近系统盘坏了,换了新SSD,也换了新版的ubuntu 18.04LTS;不得不说,ubuntu 的桌面搞的越来越漂亮了。 把调整过的zsh shell样式,截个图上来镇一下楼: 添加了对python virtuale...

janl
4分钟前
0
0
阿里云物联网边缘计算加载MQTT驱动

写在前面 本文在LinkEdge快速入门样例驱动的基础上,加载了MQTT订阅的客户端,使得边缘端容器可以通过MQTT获得外部数据。 1. 系统需求 物联网边缘计算平台,又名Link IoT Edge[1]。在物联网边...

阿里云云栖社区
5分钟前
0
0
错误: 找不到或无法加载主类

在IDEA的使用过程中,经常断掉服务或者重启服务,最近断掉服务重启时突然遇到了一个启动报错: 错误:找不到或无法加载主类 猜测:1,未能成功编译; 尝试:菜单---》Build---》Rebuild Pro...

安小乐
21分钟前
1
0
vue路由传参,刷新页面,引发的bug

最近遇到一个bug 通过vue路由跳转到页面, 然后接参控制(v-if ),成功显示 而刷新页面,显示失败。 苦苦地找了半天原因,打印参数发现正确,再打印下类型......,路由跳过来会保持传参时的...

hanbb
22分钟前
1
0
【58沈剑 架构师之路】InnoDB,select为啥会阻塞insert?

MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一。 但是,如《InnoDB,5项最佳实践》所述,如果查询没有命中索引,也将退化为表锁。 InnoDB的细粒度锁,是实现在索引记录上的。 一,Inn...

张锦飞
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部