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

外键实例(一对多)

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客户端实现.net升级

    客户端.net版本由3.5升级到4.5,首先把.net4.5的离线安装包添加到资源,程序运行的时候,从资源中生成离线安装包,并通过传递参数的方式执行静默安装命令,具体代码如下: private sta ...

  2. Win10系列:UWP界面布局进阶2

    为了让用户可以在流畅浏览应用界面的同时提供与应用相关的功能按钮,Windows 10系统在用户界面当中引入了侧边栏,侧边栏可以在用户有需要对应用或者系统进行操作时显示,在没有需要操作的时候自动隐藏,并 ...

  3. java集合框架图

  4. js MDN 查看

  5. 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 ...

  6. bzoj1261

    题解: 看到了树 很明显就是树形dp吗 然后随便yy一下方程就好了 代码: #include<bits/stdc++.h> using namespace std; int n,j; ], ...

  7. python实现用户登录界面

    要求 输入用户名密码正确,提示登录成功, 输入三次密码错误,锁定账户. 实现原理: 创建两个文件accout,accout_lock accout记录用户名,密码 accout root 1qazxs ...

  8. Saiku通过iframe嵌入web页面(六)

    Saiku通过iframe嵌入系统页面 前提: Saiku已安装好,并且配置了数据源,熟练了saiku的基本使用. 一.将整个Saiku嵌入页面 在web项目中,新建index.jsp页面,内容如下: ...

  9. 数据库-->表操作

    一.MySQL存储引擎 # InnoDB MySql 5.6 版本默认的存储引擎.InnoDB 是一个事务安全的存储引擎,它具备提交.回滚以及崩溃恢复的功能以保护用户数据.InnoDB 的行级别锁定以 ...

  10. HTML--思维导图

    HTML--思维导图