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

外键实例(一对多)

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. 关于Object.prototype.toString.call

    slice(8,-1)意思是从第8位开始(包含第8位)到最后一位之前(-1的意思就是最后一位,不包含最后一位): Object.prototype.toString.call(boj)这个是用来判断数 ...

  2. Ie11 的改变

    摘录地址:     http://www.4fang.net/content.jsp?id=30537 微软在上周刚刚发布了用于Windows 8.1上的首个Internet Explorer 11的 ...

  3. @ResponseBody中文乱码解决方案

    java web项目,使用了springmvc4.0,用@ResponseBody返回中文字符串,乱码$$ 本以为很简单的问题,不过也找了一个小时. 网上有说这样配置的: <mvc:annota ...

  4. day16 初识面向对象

    今天主要学习内容: 1.初始面向对象 2 .类 ,对象 3,面向对象和面向过程的对比 4.面向对象的三大特征 1,初始面向对象 面向过程 : 一切以实物的发展流程为中心 面向对象: 一切以对象为中心, ...

  5. 准备下上机考试,各种排序!!以后再添加和仿真像wiki上那样!

    #include <stdio.h> #include <string.h> #define N 6 typedef struct { ]; int score; }stude ...

  6. tensorflow-可视化

    先学习几个英文单词 summary 汇总,摘要 scope 范围 我这是很早以前的笔记,后来有了博客才发布的,有些内容比较老,懒得改了.  先说明总体流程 暂时不管怎么编程,假设已经有了如下代码,可执 ...

  7. poj1062(分区间迪杰斯特拉,内含测试数据,一直wa的同学可以进来看看)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54946   Accepted: 16518 Descripti ...

  8. mysql encode decode加密和解密

    加密:模板:insert into user(userpass) values(encode('useerpass','str')) insert into user(userid,username, ...

  9. svn+http+ad域

    svn本地添加用户太麻烦了,如果公司有一百个开发人员要访问,要创建账号密码太麻烦了:所以让他们用AD域账号去登录就很方便,但是权限的管控还是在svn的本地添加(这个暂时还没办法很好的解决) 一.安装依 ...

  10. jar安装

    安装sdk jar 安装到本地 mvn install:install-file -Dfile=F:\workspace\api-cookbook\java\src\main\lib\sdk-1.10 ...