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

外键实例(一对多)

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. 动态规划-最长单调递增子序列(dp)

    最长单调递增子序列 解题思想:动态规划 1.解法1(n2) 状态:d[i] = 长度为i+1的递增子序列的长度 状态转移方程:dp[i] = max(dp[j]+1, dp[i]); 分析:最开始把d ...

  2. Daily record-August

    August11. A guide dog can guide a blind person. 导盲犬能给盲人引路.2. A guide dog is a dog especially trained ...

  3. C# 爬虫DLL文件 学习网站

    http://blog.csdn.net/u013063099/article/details/73201649?locationNum=15&fps=1 http://www.cnblogs ...

  4. HashMap与TreeMap按照key和value排序

    package com.sort; import java.util.ArrayList; import java.util.Collections; import java.util.Compara ...

  5. bzoj1968

    题解: 显然每一个数对答案的贡献为n/i 代码: #include<bits/stdc++.h> using namespace std; int n; int main() { scan ...

  6. 正则:img的url,width,height 和 a标签的url以及替换

    代码:// 内容:$detail['content'] //img的url,width,height $img = array(); $matches = array(); $regeImg = '/ ...

  7. Mac下安装ipython与jupyter

    IPython从Python发展而来,更倾向于科学计算.互联网数据分析更喜欢用. 首先切换root用户: sudo su - pip3自动安装ipython yuchaodeMacBook-Pro:~ ...

  8. Python3.7.0的安装方法

    安装Python3.7.0 1.下载Python-3.7.0.tar.xz包安装 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.t ...

  9. (C/C++学习笔记) 三. 作用域和可见性

    三. 作用域和可见性 ● 标识符的作用域 标识符的作用域是标识符在程序源代码中的有效范围,从小到大分为函数原型作用域.块作用域(局部作用域),文件作用域(全局作用域). 1. 函数原型作用域 函数原型 ...

  10. 用servlet实现用户登录案例

    以下实现登录窗口 Login.jsp <!--Login.jsp--> <%@ page language="java" import="java.ut ...