mysql:外键
mysql:外键
转自:https://www.cnblogs.com/brucemengbm/p/6897410.html
一个班级的学生个人信息表:




什么是外键
在设计的时候,就给表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)
mysql:外键的更多相关文章
- 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外键的使用
MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...
- mysql 外键和子查询,视图
1.mysql 外键约束 建表时生成外键 foreing key ('sid') references' student'('id'); 建表后添加外键 alter table' course ...
- mysql外键使用和事物使用
mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...
- Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491 版权声明:本文为博主原创文章 ...
- mysql外键约束总结
总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是 ...
随机推荐
- python3学习-logging模块
1.logging模块的使用非常简单,引入模块就可以使用. import logging logging.debug('This is debug message') logging.info('Th ...
- 链表:如何实现LRU缓存淘汰算法?
缓存淘汰策略: FIFO:先入先出策略 LFU:最少使用策略 LRU:最近最少使用策略 链表的数据结构: 可以看到,数组需要连续的内存空间,当内存空间充足但不连续时,也会申请失败触发GC,链表则可 ...
- k8s学习笔记
9.deployment:声明式的升级应用 9.1.使用RC实现滚动升级 #kubectl rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v ...
- Sqlserver 使用.net查询被事务锁住处理
在有些应用场景中.事务开了后或能需要再去调用某个DAL读取表中的数据.但DAL里又是新开的链接,由于外面有事务所以这里读的时候就读不到.这种情况下可以在这个DAL的查询里开一个新的事务级别设为允许脏读 ...
- ZooKeeper 相关概念以及使用小结
Dubbo 通过注册中心在分布式环境中实现服务的注册与发现,而注册中心通常采用 ZooKeeper,研究注册中心相关源码绕不开 ZooKeeper,所以学习了 ZooKeeper 的基本概念以及相关 ...
- Linux任务调度(8)
crond任务调度: 是指系统在某个时间执行特定的命令或程序. 分类:1.系统工作,有些重要的工作必须周而复始地执行,如病毒扫描等:2.个别用户工作,个别用户可能希望执行某些程序,如mysql数据库备 ...
- Java 迭代接口:Iterator、ListIterator 和 Spliterator
1. 简介 当我们使用 for 或 while 循环来遍历一个集合的元素,Iterator 允许我们不用担心索引位置,甚至让我们不仅仅是遍历一个集合,同时还可以改变它.例如,你如果要删除循环中的元素, ...
- Egret白鹭开发小游戏之自定义load加载界面
刚接触不久就遇到困难------自定义loading.想和其他获取图片方式一样获取加载界面的图片,结果发现资源还没加载就需要图片,在网上百度了许多,都没有找到正确的方式,通过自己的摸索,终于,,,我成 ...
- MapDB使用入门
背景 MapDB官网:http://www.mapdb.org 官方翻译之后的话:MapDB基于堆外存储.磁盘存储提供了Java的Maps.Sets.Lists.Queues等功能.它混合了Java集 ...
- Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves)
Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves) 深度优先搜索的解题详细介绍,点击 给出一个二维数组 A,每个单元格为 0(代表海)或 1( ...