问题:下列这张表中部门等列名下输入的数据没有约束,那么可以随便填写符合规则的数据但是不符合实际需求的值,这样就造成了不符合规则的数据在表中存在,外键就是为了解决这个问题,管理员可以在另一张表中设置好符合规则的数据,然后让其他的表调用,又比如一个部门改名了,如果这个表中有几百行数据,相同的也有几百行,那么一行一行的修改时非常耗时和没有工作效率的,为了解决这个问题,就要引用外表的数据,这样只要修改外表的一个数据,就可以同步到数据表中

外键实例(一对多)

PS:比如一个人只能在一个部门,而一个部门可以有多个人,这样的关系就是一对多

需求:能够知道一个员工在什么部门

表1

create tale user(

  id int unsigned auto_increment primary key,

  name char(32) not null default'',

  age int not null default 1, #age列的默认值是1

  depertment int not null default 1 #depertment_id 的默认值是1

  constraint  depe_id foreign key user('deperment') references depertment('id')  #创建一个外键的语句格式

  depe_id(就是外键的名字,自定义) \ user就是表的名字(需要加约束的列名) \ depertment 就是外键表的名字(外键表的id列)

)charset=utf-8;

表2

creat table deperment(

  id int unsigned auto_incerment pirmary key,

  depname char(32) not null default

)charset=utf8;

外键的唯一索引\唯一约束 (一对一)

---作用就是给这一列的值创建外键后,不能出现重复的值

唯一约束实例:场景就是一个博客,每一个用户名有一个专门的页面,这里数据库就要唯一性,一个用户名不能有多个博客,给链接地址表创建外键,用户名表和博客地址表建立关联,并且约束的列不能有重复的外键值

PS:就是一个用户名只能对应一个博客地址,这样的关系就是一对一

'''这张是用户表,存放用户名的'''

create table user(

  id int unsigned auto_increment pirmary key,

  name char(32) not null default''

)charset=utf8

'''这张是用户博客的地址表'''

create table article(

  id int unigned auto_increment primary key,

  url carchar(32) not null default'',

  uid int not null default 1,

  constraint fk_name foreign key('uid') reference user('id')

  unique(uid)   #给uid创建了约束,值不能重复

  unique(id,url)   #联合唯一索引

)charset=utf8;

PS:给article表的uid列增加了外键,并且添加了唯一约束的条件,所以如果uid值相同则会报错

外键的(多对多)

例:登陆服务器账号的权限的管理

PS:一个用户名可以同时对应多个主机,而一个主机也能够对用多个用户,这样关系就叫多对多

需求:要给用户添加登陆哪台服务器的权限,而且还能方便统计一个账号有几台服务器的权限

连表查询

需求:建立好外键后查看对应关系,不是要查看对应的id,而是查看名字对应的部门,或者账号对应的博客地址

PS:连表查询的效率是很低的,如果工作中业务是对外的,成百上千万的用户量,不要使用连表查询,如果是公司内部也就几十到几百人的访问量,使用连表查询不会有影响,因为针对上千万的用户量肯定要涉及到用户体验度关系到用户的接受度,数据量大的时候程序会跑半天,而公司内部没有那么高的数据量

inner join #这个叫笛卡尔积

select * from tablename1 inner join,tablename2 on tablename1.外键_id=tablenam2.id   #将两张表的值所有列的值全部获取

select  tablename1.列名, tablename2.列名 from tablename1 innerjoin tablename2 on tablename1.外键列_id=tablename2.id   #查询获取的不是id,而是值对应的值

left join #左边的表数据全部显示

select * from tablename1 left join tablename2 on tablename1.外键列_id=tablename2.id  #做好外键后查看对应的值,这个指令会将表对应表全部获取

PS: left join tablename2 on tablename1.外键列_id=tablename2.id后面还可以跟 left join tablename2 on tablename1.外键列_id=tablename2.id,可以进行三表联查或者四表联查

right join  #右边的表数据全部显示

select * from tablename1 right join tablename2 on tablename1.外键列_id=tablename2.id  #做好外键后查看对应的值,这个指令会将表对应表全部获取

(4)MySQL的外键(不同表之间的数据关联)的更多相关文章

  1. oracle查询某张表的外键,并用 truncate 命令有外键的表中的数据

    注:本文来源于<oracle查询某张表的外键(最终解决办法)> 一:几个查询表外键的脚本 select b.table_name, b.column_name from user_cons ...

  2. 5月9日 python学习总结 外键、表之间的关联关系、修改表、清空表内容、复制表

    一.外键foreign key    外键约束: 1.必须先创建被关联表才能创建关联表 2.插入记录时,必须先插入被关联表的记录,才能插入关联表(要用到被关联表)的记录 3.若不设置同步更新和同步删除 ...

  3. Mysql 主外键与索引之间的区别和联系

    系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部 ...

  4. mysql 设置外键约束时如何删除数据

    Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新 ...

  5. MySQL 添加外键约束,不检查现有数据

    这可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHE ...

  6. mysql 创建外键时发生错误的原因和解决方法

    可以去网上查看错误号,就能知道到底哪里出错了 https://zhidao.baidu.com/question/359868536.html 这里1452对应的错误是因为建立外键的表中还有数据,所以 ...

  7. MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)

    MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作): a.创建2张表 create table userinfo(nid int not nul ...

  8. 第二百八十节,MySQL数据库-外键链表之一对多,多对多

    MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...

  9. Django中ORM外键和表的关系(Django编程-4)

    外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来 ...

随机推荐

  1. wpf自定义控件中使用自定义事件

    wpf自定义控件中使用自定义事件 1 创建自定义控件及自定义事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2 ...

  2. IDE 版本

    BDS 5 2007 D11  VER180 and VER185 RAD Studio 8 XE D15  VER 220 RAD 18 XE 10.1 Berlin D24  VER310  St ...

  3. 读书笔记 C# yield return与yield break执行顺序的浅析

    yield return可一次返回一个元素,并保留当前在代码中的位置,下次调用当前迭代器函数时,将从该位置从新执行.也就是说执行了yield return的时候,迭代器函数就返回了一个元素给forea ...

  4. [Leetcode 44]通配符匹配Wildcard Matching

    [题目] 匹配通配符*,?,DP动态规划,重点是*的两种情况 想象成两个S.P长度的字符串,P匹配S. S中不会出现通配符. [条件] (1)P=null,S=null,TRUE (2)P=null, ...

  5. 扩展HtmlHelper类实现Mvc4分页

    1.扩展HtmlHelper类方法Pager public static HtmlString Pager(this HtmlHelper htmlHelper, int currentPage, i ...

  6. 类的无参方法和Doc注释

    一:Java Doc注释: 语法: /** *AccpSchool 类 *@author JadeBird *@version 1.0 2018/5/26 */ Java Doc是前Sun公司提供的一 ...

  7. 18-09-08 关于Linux 的安装遇到的一些小坑

    具体参考我的有道笔记 备注  那个网络问题已经解决 先自动选择打上勾 然后在进行选择 并且正确输入 IP地址之类的 ====用utrallo 制作centos7.0 报错 以下是新的工具有效===== ...

  8. python-django优缺点

    [Django]是利用[Python]语言从事[Web]开发的首选框架.如果你以后想从事[python web]开发工作,就必需了解其优缺点.这些都可能会是你将来的面试题哦. [Django]的优点 ...

  9. sqlite的数据类型

    参考sqlite官方文档:https://www.sqlite.org/datatype3.html 绝大多数的SQL数据库采用静态的.严格的数据类型,数据库中的值由数据表的列类型定义决定. 然而,s ...

  10. ie 折腾计(浏览器兼容性)

    常见问题 IE:6.0,IE7.0,IE8.0之间的兼容独立说明 /*用于展示标签*/ <div class="jrx"></div> <style ...