mysql外键理解
一个班级的学生个人信息表:
什么是外键
在设计的时候,就给表1加入一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表。
外键用来干什么
为了一张表记录的数据不要太过冗余。
这和软件project的模块化思想差点儿相同类似,仅仅只是在数据库中是对表关系进行解耦,尽量让表 记录的数据单一化。就如你贴的图片中,把成绩和学生信息放在一张表中就太冗余了。
为什么说外键能保持数据的一致性、完整性
你想想,你的图中的第一章表切割成了表1和表2,表2的学号引用了表1的学号字段作为外键,假设不建立外键,仅仅是和表1一样单纯性地设立一个学号字段,那么和建立外键有什么差别呢?
比方表1中张三的学号为20140900001。那么我在表2中插数据的时候在学号字段插20140900001来记录张三的成绩不也是做到了表的解耦了吗?
这里存在的问题是,在不设置外键的情况下。表2的学号字段和表1的学号字段是没有关联的。仅仅是你自己觉得他们有关系而已,数据库并不觉得它俩有关系。也就是说,你在表2的学号字段插了一个值(比方20140999999),可是这个值在表1中并没有,这个时候,数据库还是同意你插入的,它并不会对插入的数据做关系检查。然而在设置外键的情况下,你插入表2学号字段的值必需要求在表1的学号字段能找到。同一时候,假设你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。
这就是所谓的保持数据的一致性和完整性。你想,假设表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号相应的学生是哪个学生。数据的一致性还包含数据类型的一致性(这个见以下就知道了)。
外键的使用规则
从表的字段必须与外键类型同样(如上,分数表 stu 的类型必须和学生表 sid 的类型同样,比方都是 int(10) 类型);外键必须是主表的唯一键(如上,学生表 sid 是主键,而主键是唯一的,所以能够作为分数表 stu 的外键);有关联的字段(如上,分数表之所以使用学生表的 sid 是由于两者有关联。分数表记录的是学生的分数,而学生能够用 sid 来唯 一标识);避免使用复合键(也就是说从表能够同一时候引用多个主表的字段作为一个外键,一般不推荐这样的做法)。
外键不一定须要作为从表的主键。外键也不一定是主表的主键。主表的唯一键就能够作为从表的外键。
1、外键是属于约束的一种,所谓约束顾名思义,就是限制你在数据库的操作。而你对数据库有什么操作,无非是增、删、改、查。外键起的作用就是让你在数据库帮助的情况下更合理的添加数据的正确度。
2、所以,外键仅仅是辅助,假设A表的id字段设置为B表id的外键。仅仅是建立了一种约束关系,在建表的时候,即使A表id字段建立后,B表也要建立id字段。
3、外键的作用是可以避免例如以下情况。
如 【班级信息表】存放的是班级信息表。
【学生表】存放的是学生信息,包括班级信息。
这个时候 在【学生表】中存放的班级信息应该在【班级信息表】存在才合法,自己人为控制的话难免有漏掉的情况,用外键则可以让数据库自己主动控制,当插入【学生表】中的数据在【班级信息表】不存在的时候,数据库不同意插入。
建立方法
能够在创建表的时候创建,也能够在创建表之后创建。
创建表时创建:
create table student
(id int primary key,
name char(4),
dept char(9)
sex char(4)) create table grade
(id int ,
grade int
constraint id_fk foreign key (id) references student (id)
) 或创建了两表之后再建
alter table grade
add constraint id_fk foreign key (id) references student (id) 来源:https://www.cnblogs.com/brucemengbm/p/6897410.html
mysql外键理解的更多相关文章
- mysql 外键理解
假定一个班级的学生个人信息表: 什么是外键 在设计的时候,就给表1加入一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表.(注意: 外键不一定须要作为从表的主键.外键也不一定是 ...
- Mysql外键的使用
MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...
- Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491 版权声明:本文为博主原创文章 ...
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- Mysql 外键设置
MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给 ...
- MySQL外键的作用和创建
MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...
- mysql 外键和子查询,视图
1.mysql 外键约束 建表时生成外键 foreing key ('sid') references' student'('id'); 建表后添加外键 alter table' course ...
随机推荐
- Linux 远程复制
一.将本机文件复制到远程服务器上 #scp /usr/local/kafka_2.11-0.11.0.0/config/server.properties app@172.25.6.11:/haha ...
- Mozilla Network Security Services拒绝服务漏洞
解决办法: 运行 yum update nss yum update nss
- APP移动端开发html模板
移动端开发模板: 750的稿子除以75: <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu ...
- [转]Algolia的分布式搜索网络架构
转自:http://www.csdn.net/article/2015-03-11/2824176-the-architecture-of-algolias-distributed-search-ne ...
- 对JVM的理解
操作系统内核是至高无尚的内功心法,只有掌握了内功,学习其他的武功才会轻而易举. 现在我们来谈谈java.JVM其实是操作系统中运行的进程,JVM有操作系统进程的所有共性,但是它却不是一个普通的进程,它 ...
- c++之旅:多态
多态 同一消息根据发送对象的不同而产生不同的行为,多态是建立的在封装和继承的基础之上 一个小案例引发的问题 #include <iostream> using namespace std; ...
- 异常信息 Exception
void GetExceptionMsg(Exception ex, StringBuilder sb, string Prefix = "") { sb.AppendLine(P ...
- 如何用纯 CSS 创作一个跳 8 字型舞的 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gKNMMm 可交互视频 此视频是可 ...
- 20145302张薇 《Java程序设计》第二周学习总结
20145302张薇 <Java程序设计>第一周学习总结 教材学习内容总结 第三章 第三章讲的是基本类型,变量,运算符和基本条件语句. 基本类型分为: 整数:short(2 byte),i ...
- 游戏服务器的思考之三:谈谈MVC
游戏服务器也是基于MVC架构的吗?是的,所有的应用系统都是基于MVC架构的,这是应用系统的天性.不管是客户端还是后台,都包含模型.流程.界面这3个基本要素:不同类型的应用,3要素的“重量”可能各有偏差 ...