有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进。自己做项目demo永远只能用一张表...

所以今天还是学习了下外键希望能够搞明白一些...

百度上搜索外键的作用"保持数据的完整性,一致性","参照完整性"...什么的,我想信很多小伙伴都不明白到底什么意思.

首先我么要搞明白,为什么要使用外键,

比如有两张表(在最下面我会附上表的创建SQL语句,以及外键的添加和关联删除时候的语句)

表一(student1)有字段:stu_id(学号),stu_name(姓名),stu_gender(性别),stu_nation(民族),stu_idcard(身份证号)

表二(score1)  有字段:stu_id(学号),stu_chinese(语文成绩),stu_math,stu_english,stu_pe(体育成绩)

通过关联stu_id,就可以把表一表二在操作的时候可以拼凑成一张大表,

        字段::stu_id(学号),stu_name(姓名),stu_gender(性别),stu_nation(民族),stu_idcard(身份证号),stu_chinese(语文成绩),stu_math,stu_english,stu_pe(体育成绩)

不用外键的话,貌似也可以正常操作,比如,你可以任意添加给任何一张表任何信息,但是如果有了外键(student1的stu_id引用score1中的stu_id)

        你就不能先给student1执行insert操作,因为student1中的stu_id和score1中的stu_id有关联

        所以就必须得先给score1表赋值INSERT INTO score1    VALUES('201890001',95,88,97,95);

        随后才能够INSERT INTO student1 VALUES('201890001','张三','男','汉','123468744123597014');因为在insert给student1表的时候,stu_id必须与之前赋值给score1表中的一致,也就是说
        给从表赋值的时候,关联的字段值必须在主表中能找到!否则就添加失败,这就是外键的作用!

        比如:如果我给score1中添加了学号为1的一名学生的学生成绩,当我给student1表中添加了一个学号为2的学生信息的时候,是添加不成功的,因为没有关联上,除非score1中有学号为2的学生成绩信息。只有这样,才能够有参照作用,所以才保证了参照完整性。

补充:什么是从表,什么是主表,student1中有语句    CONSTRAINT fk_stu_id_score1 FOREIGN KEY(stu_id)    REFERENCES score1(stu_id)  就意味着,score1是主表,student1是从表(虽然我也经常头晕...但想着,主表的关联字段必须是主键,它就大一点,它就是主表把~...)
刚刚提到了,主表的关联字段必须是主键。是这么个意思:student1中的stu_id和score1中的stu_id关联,score是主表,stu_id必须是score1表的主键,而stu_id在student1中是不是主键无所谓。

接下来就是主外键关联删除的删除:

    score中的信息删除时候,从表student1中的关联信息怎么解决,比如主表中学号为1的学生成绩信息被删除了,那么从表student1中的学号为1的学生信息怎么办,有三种解决方式:   

      1、禁止删除(不允许删除,会报错)

      2、将参照要删除数据的子表对应数据置空。(从表中学号为1的学生信息为空,null)在创建外键的后面加上   ON DELETE SET NULL(后面会附上练习表的创建语句)

      3、将参照要删除数据的子表对应数据删除。(从表中学号为1的学生信息删除)在创建外键的后面加上   ON DELETE CASCADE

      注意如果是置空或者删除的话,要注意能不能删除或者置空,比如你设置了那个字段是NOT NULL,主表删除的时候,从表中的也会删除,但是从表中你又定义了NOT NULL,所以就会报错。这也是发    现的一个报错的原因...

 (

  其实我写到这才发现我练习的主外键关联对应的表有逻辑问题,应该再score1上添加外键,让student1当主表,score1当从表,所以当student1中学号为1的学生信息删除了,score1从表中学号为1的数据怎么办?当然是删除了,你  学生都没了(比如退学),还要保存他的成绩信息干什么?当然这都是题外话,我也懒得从头再改了,相信大家应该看得懂。逻辑翻转想一下就会明白,

  或者说,有一个表示会员表,一个表是订单表,

  会员表要引用订单表中的信息,他们通过会员ID字段关联,当会员表中的某一个会员信息删除了,根据正常需要,基本都是把订单表中对应的信息也删除了,因为你会员都没了要保存订单信息干什么?所以就是上述的第三种解决方式,

 )

好了,回归到之前的假设场景,student1是从表,score1是主表,将错就错下去吧...

我觉得明白了以上的概念逻辑后,其他的能稍微想通一些了吧,比如写sql语句报错的时候就能明白为什么要先这样,才能那样。。。接下来我附上我练习实验用的表的sql语句.

 USE test;

 /*要先删除从表,才能删除主表(从表中需要引用主表中的字段,先删除主表,那么从表就不成立因为从表中还有着和主表的关联关系)*/
DROP TABLE IF EXISTS student1;
DROP TABLE IF EXISTS score1; CREATE TABLE score1(
stu_id VARCHAR(50) NOT NULL,
stu_chinese DOUBLE,
stu_math DOUBLE,
stu_english DOUBLE,
stu_pe DOUBLE,
CONSTRAINT pk_stu_id_score1 PRIMARY KEY(stu_id)
);
CREATE TABLE student1(
stu_id VARCHAR(50),
stu_name VARCHAR(50),
stu_gender VARCHAR(5),
stu_nation VARCHAR(50),
stu_idcard VARCHAR(50) NOT NULL,
CONSTRAINT pk_stu_idcard_student1 PRIMARY KEY(stu_idcard),
CONSTRAINT fk_stu_id_score1 FOREIGN KEY(stu_id) REFERENCES score1(stu_id) ON DELETE CASCADE
); /*下面两条插入语句顺序颠倒会报错*/
INSERT INTO score1 VALUES('',95,88,97,95);
INSERT INTO student1 VALUES('','张三','男','汉','');

这是我学习时候参考的两个网页地址

  1.https://www.cnblogs.com/bhlsheji/p/5332910.html

  2.https://blog.csdn.net/bisal/article/details/20898055

  欢迎大家讨论下啊,我也是初学希望多多指教,有哪里不对的请指出讨论一下~谢谢...

    

Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)的更多相关文章

  1. MySQL中的SQL流程分析简述

    分析MySQL中这条语句的整个流程 update table_a set c1=xx where c2=xxx 朋友考我的一个问题在此处列出个人见解 1 客户端连接进来首先进行权限验证 2 验证通过后 ...

  2. (4) MySQL中EXPLAIN执行计划分析

    一. 执行计划能告诉我们什么? SQL如何使用索引 联接查询的执行顺序 查询扫描的数据函数 二. 执行计划中的内容 SQL执行计划的输出可能为多行,每一行代表对一个数据库对象的操作 1. ID列 ID ...

  3. [转]两表join的multi update语句在MySQL中的执行流程分析

    出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...

  4. MySQL 中联合查询效率分析

    目前我有两个表,一个keywords和一个news表.keyword存放关键词是从news中提取,通newsid进行关联,两表关系如图: keywords中存有20万条数据,news中有2万条数据,现 ...

  5. mysql中binglog底层原理分析

    binglog 是一个二进制的日志文件,会记录mysql的数据更新或潜在个跟新 (delete from table where id =xxx) 主从复制就是依靠binglog master -sl ...

  6. MySQL中的约束,添加约束,删除约束,以及其他修饰

    一.NOT NULL(非空约束)添加非空约束 1)建表时直接添加 CREATE TABLE t_user(user_id INT(10) NOT NULL); 2)通过ALTER 语句 ALTER T ...

  7. MySQL中的索引的引用

    博文首先说明索引的分类及创建,然后会涉及到索引的可用性选择以及索引的优化. 索引是什么?先说创建索引的目的,创建索引是为提高对数据的查询速度.在字典的目录中,我们可以很快找到某个字的位置,索引的作用就 ...

  8. mysql中主外键关系

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  9. mysql|中主外键关系(转)

    http://my.oschina.net/liting/blog/356150 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标 ...

随机推荐

  1. CSS中的px与物理像素、逻辑像素、1px边框问题

    一直不太清楚CSS中的1px与逻辑像素.物理像素是个什么关系(作为一名前端感觉很惭愧 -_-!),今天终于花时间彻底弄清楚了,其实弄清楚之后就觉得事情很简单,但也只有在弄清楚之后,才会觉得简单(语出& ...

  2. 第45节:Java当中的变量,面向对象

    Java当中的变量 01 Java当中的实例变量和类变量 什么是实例变量和类变量呢? 实例变量为没有用static修饰符修饰的变量,而类变量为用static修饰符修饰的变量. public class ...

  3. [原创] 详解云计算网络底层技术——虚拟网络设备 tap/tun 原理解析

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 在云计算时代, ...

  4. JDK9新特性实战:流关闭新姿势

    做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能. 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化. JDK6 在JDK ...

  5. Zookeeper-watcher机制源码分析(二)

    服务端接收请求处理流程 服务端有一个NettyServerCnxn类,用来处理客户端发送过来的请求 NettyServerCnxn public void receiveMessage(Channel ...

  6. eos开发(一) eos开发环境搭建

    区块链最近挺火的,我又是个非常缺钱的人,所以紧跟了潮流一头扎进区块链的研究中. 这EOS项目是目前比较火的一个项目,相信很多朋友拿到这份EOS的源代码后都会一脸懵逼,因为……这代码写得太高级了,老纸看 ...

  7. CentOS7+Mono5.2.0.224 +Jexus5.8.3.0 布署 Asp.Net MVC (vs2017)

    背景: 比起大神我们只是差远了,只知道一味的找找看,找的资料不少,但真不知道哪一个是正确的. 之前一个文章也写了怎么安装 Jexus 但始终只有是html的静态页面可以asp.net 都不行(http ...

  8. 翻译:SockJS-node文档(一)

    什么是SockJS? SockJS是一个提供Websocket通信的JavaScript库,目的是实现在浏览器与服务器之间低延迟.全双工.跨域通信,它提供跨浏览器的统一API,即使不支持HTML5 W ...

  9. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  10. Salesforce Sales Cloud 零基础学习(四) Chatter

    Chatter是一个Salesforce实时协作应用程序,它允许你的用户一起工作.互相交谈和共享信息,不管用户角色或位置如何,连接.并激励用户在整个组织内高效工作. Chatter 让用户们在 Opp ...