有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进。自己做项目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语句.

 1 USE test;
 2
 3 /*要先删除从表,才能删除主表(从表中需要引用主表中的字段,先删除主表,那么从表就不成立因为从表中还有着和主表的关联关系)*/
 4 DROP TABLE IF EXISTS student1;
 5 DROP TABLE IF EXISTS score1;
 6
 7 CREATE TABLE score1(
 8     stu_id                         VARCHAR(50)    NOT NULL,
 9     stu_chinese                    DOUBLE,
10     stu_math                       DOUBLE,
11     stu_english                    DOUBLE,
12     stu_pe                         DOUBLE,
13     CONSTRAINT    pk_stu_id_score1    PRIMARY KEY(stu_id)
14 );
15 CREATE TABLE student1(
16     stu_id                        VARCHAR(50),
17     stu_name                      VARCHAR(50),
18     stu_gender                    VARCHAR(5),
19     stu_nation                    VARCHAR(50),
20     stu_idcard                    VARCHAR(50) NOT NULL,
21     CONSTRAINT pk_stu_idcard_student1 PRIMARY KEY(stu_idcard),
22     CONSTRAINT fk_stu_id_score1 FOREIGN KEY(stu_id)    REFERENCES score1(stu_id)    ON DELETE CASCADE
23 );
24
25 /*下面两条插入语句顺序颠倒会报错*/
26 INSERT INTO score1    VALUES('201890001',95,88,97,95);
27 INSERT INTO student1 VALUES('201890001','张三','男','汉','123468744123597014');

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

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

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

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

    

转载于:https://www.cnblogs.com/deepSleeping/p/9525779.html

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

  1. Mysql中慢查询语句分析

    序言 学习方法这是大部分人都可以掌握的,但是学习的驱动力可能每个人都不太相同.有的人是真正的热爱,有的人是为生活所迫,而有的人是为了证明自己. 我不算是一个热爱编程的人,至少之前一直不算是,对于自己的 ...

  2. Mysql中慢SQL的分析与优化

    为何对慢SQL进行治理 从数据库角度看:每个SQL执行都需要消耗一定I/O资源,SQL执行的快慢,决定资源被占用时间的长短.假设总资源是100,有一条慢SQL占用了30的资源共计1分钟.那么在这1分钟 ...

  3. MySQL中的MRR优化分析

    前言 MRR全称:Multi-Range Read,中文翻译过来就是多范围读取,主要解决的是当二级索引取出索引值后再去聚集索引中取行可能会造成大量的磁盘随机IO的问题,下面我们来具体进行分析. Ind ...

  4. mysql中的%_mysql入门

    MySQL 数据库 1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: 可存储大量数据: 方便检索: 保持数据的一致性.完整性: 安全,可共享: ...

  5. mysql中如何删除表中int约束,MySQL中的约束,添加约束,删除约束,以及其他修饰

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

  6. mysql中整理设置__MySQL整理

    登录 命令:mysql -h [IP 地址/域名] -P [端口] -u [用户名] -p[密码] 端口默认是3306 mysql -hlocalhost -uroot -p 断开 exit; \q; ...

  7. MySQL中的各种查询

    文章目录 MySQL中的各种查询 基础查询 条件查询 排序查询 常见函数查询 分组查询 连接查询 内连接 外连接 交叉连接 子查询 联合查询 MySQL中的各种查询 基础查询 条件查询 #语法:sel ...

  8. MySql中的NULL值和空值

    定义: 空值:表示一个空字符或零长度的字符串,可以使用空引号""来表示: NULL值:MySql中,NULL表示缺少一个已知或适当的值. 除了整数类型的列外,所有其他类型的列(包括 ...

  9. Oracle 主外键约束

    一 主键(Primary Key) 1 一个表只能有一个主键,作为主键的列具有唯一(unique)和非空约束(not null): 2 对列创建了主键约束的同时,会自动对列创建一个索引: 3 创建表时 ...

最新文章

  1. 国外十大最流行PHP框架排名
  2. sed当中使用变量替换以及执行外部命令
  3. 【Python】Jupyter notebook
  4. 【总结】有三AI大量原创视频和图文资料,你都存下来了吗
  5. 光流 | 基于Horn-Schunck HS变分光流算法改进
  6. Xcode8.0 删除插件路径
  7. 玩转oracle 11g(17):命令学习5
  8. servlet基础总结
  9. datx 开启debug
  10. 说明assert()的作用:assert()是一个调试程序时经常使用的宏,在程序执行时计算括号内的表达式,如果表达式为假,程序报告错误,并终止执行;若表达式为真,则继续执行后面的语句。
  11. 壁面函数matlab,Y+的查看及FLUENT壁面函数的选择
  12. 九大内置对象和四大作用域
  13. 目标检测(二):OverFeat
  14. 导航卫星系统实时可视化平台开发
  15. [NLP]高级词向量表达之Word2vec详解(知识点全覆盖)
  16. 唯品会开源分布式作业调度平台Saturn
  17. 杰理之优化电脑长时间播放没声音【篇】
  18. java map 参数传递_Java参数传递分析
  19. 丢手帕问题 java_java基于双向环形链表解决丢手帕问题的方法示例
  20. 初识Python爬虫----如何爬取网络数据

热门文章

  1. ctf线下赛mysql密码_CTF线下攻防赛
  2. php html小项目,使用PHP把HTML生成PDF文件的几个开源项目介绍
  3. Android的ListView长按监听器
  4. 20200815:力扣201周周赛题解记录下
  5. 20190830:(leetcode习题)二叉树的最大深度
  6. 借助计算机软件进行文学写作,网络文学创作对编辑提出的新要求及建议
  7. 用python如何制作表格步骤_Python中用xlwt制作表格实例讲解
  8. 服务器上把计算机放桌面,远程服务器这么显示在电脑桌面
  9. python中的reg_如何在python中从注册表读取字符串格式的Reg_二进制类型值
  10. vb 开机到现在的时间