MySQL之Foregin_Key

  一\\一对多

  1. 一.员工表和部门表
  2. dep emp
  3. 类似与我们将所有的代码都写在一个py文件内
  4. 确立标语表之间的关系
  5. 思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)
  1. 思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)
  1. 1.先站在部门表中看能否有多个部门对应一个员工
  1. 1.先站在部门表中看能否有多个部门对应一个员工
  2. 翻译过来就是:一个员工能否有多个部门
  3. 很显然不可以!!!
  4. 在站在员工表中看能否有多个员工对应一个部门
  5. 翻译过来:
  6. 很显然是可以的!!!
  7. 所以员工表和部门表之间仅仅打火机单向事务多对一
  8. 他们的表关系就是"一对多"
  9. 表关系中没有"多对一"的说法,都是"一对多"

  让两个表代码层面上的真正的关联,就是必须使用外键

  1. 2,让两个表代码层面上的真正的关联,就是必须使用外键
  2. 什么是外键呢>>> 让表与表之间有硬性关系
  3. foreign key 注意这里是没有下滑线的
  4. foreign key
  5. 外键约束
  6. 1.在创建表的时候,必须先创建被关联系
  7. 2.插入数据的时候 也必须先插入被关联表的数据

  建表# 被关联

  1. create table dep(id int primary key auto_increment,
  2. dep_name varchar(32),
  3. dep_desc varchar(128));

  在建 关联表 注意加级联级删除(同事更新,更新的是直接关联的表)

  1. emp_name varchar(32),
  2. emp_gender enum("male","female","other") default "male",
  3. dep_id int,
  4. foreign key(dep_id) references dep(id)
  5. on update cascade
  6. on delete cascade);
  7.  
  8. # 注意的是的外键是一个完整的语句 关联的是所在表的外键id 
      应用到真正关联的表.级联级更新级联删除

  插入数据 先插入被关联的表的具体数据 id 是自动自增所以不用添加

  1. insert into dep(dep_name,dep_desc_) values('教学部','教书育人'),
  2. ('技术部','技术部门'),
  3. ('外交部','形象大使');

  # 注意:表字段要写好细节

  # 插入具体值到关联表

  1. insert into emp(emp_name,emp_gender,dep_id) values(
  2. 'koko','male',1),
  3. ('jason','male',2),
  4. ('tank','female',3),
  5. ('egon','male',3);l

  二\\多对多

  多对多 思路:换为思考

  1. 如:书籍和作者
  2. 1.先站在书籍的角度看问题
  3. 多本书能否被一个作者写
  4. # 翻译一个作者能否写多本书 很显然是可以的>>>一对多
  5. 2.再站在书籍的角度看问题
  6. 多个作者能否同写一本书
  7. 一本书能否被多个作者写 很显然也是可以的>>>一对多
  8. 综合上述 多对多
  9.  
  10. # 注意:多对多需要建立第三张关联书籍和作者的这两张表
  11. 确定好关系之后开始建表
  12. 所以建表的时候么有要求先建立那张表

建表:

  书籍表

  1. create table book(id int primary key auto_increment,
  2. title varchar(32),
  3. price int);

  作者表

  1. create table author(id int primary key auto_increment,
  2. name varchar(32),
  3. age int);

  #  多对多关系的建立 必须手动创建第三张关联表

  1. reate table book2author(id int primary key auto_increment,
  2. book_id int,
  3. foreign key(book_id) references book(id)
  4. on update cascade
  5. on delete cascade,
  6. author_id int,
  7. foreign key (author_id) references author(id)
  8. on update cascade
  9. on delete cascade);
  10. # 注意完整的一句话哈

  #开始在表中插入数据

  1. insert into author(name,age) values('koko',18),('mye',20),
  2. ('tank',28);

  # 插入第三张表的关联数据

  1. insert into book2author(book_id,author_id)
  2. values(1,2),(1,3),(2,1),(2,2),(3,2);

  三\\一对一

  这个很简单的吧 就是把一个人的一张表拆分成两张表

  节省内存 和查询的效率问题
  一般foreign key 建在查询的比较多的一方

  比如一个人的信息表

  # 还是先建立被关联的表

  1. create table authordetail(id int primary key auto_increment,
  2. phone int ,
  3. addr varchar(255));

  # 注意:括号 完整性

  # 关联表 注意唯一性 unique

  1. create table author1(id int primary key auto_increment,
  2. name varchar(32),
  3. age int,
  4. authordetail_id int unique,
  5. foreign key(authordetail_id) references authordetail(id)
  6. on update cascade
  7. on delete cascade);

  # 插入数据
  # 先插被关联表也就是详情表 

insert into authordetail(phone,addr) values
(131,'广西'),
('132','东莞'),
(133,'山西');

  # 再插入主关联表

insert into author1(name,age,authordetail_id) values
('koko',18,1),
('tank',20,2),
('jason',20,3);

  四\\总结语法

  1. 判断表关系的最简单的语法
  2. 图书与出版社
  3. 一本书可不可以有多个出版社 不可以!!!
  4. 一个出版社可不可以出版多本书 可以!!!
  5. 一对多的关系
  6.  
  7. 图书与作者表
  8. 一本书可不可以有多个作者 可以!!!
  9. 一个作者可不可以写多本书 可以!!!
  10. 多对多的关系
  11.  
  12. 作者与作者详情
  13. 一个作者可不可以有多个详情 不可以!!!
  14. 一个作者详情可不可以有多个作者 不可以!!!
  15. 要么两者是一对一
  16. 要么两者之间没任何关系

  五\\了解知识点:

  

  1. 1.修改表的完整语句
  2. 1. 修改表名
  3. ALTER TABLE 表名
  4. RENAME 新表名;
  5. 2. 增加字段
  6. ALTER TABLE 表名
  7. ADD 字段名 数据类型 [完整性约束条件…],
  8. ADD 字段名 数据类型 [完整性约束条件…];
  9. ALTER TABLE 表名
  10. ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 直接移到最前面
  11. ALTER TABLE 表名
  12. ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 寻找插哪个字段的后面
  13. 3. 删除字段
  14. ALTER TABLE 表名
  15. DROP 字段名;
  16. 4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
  17. ALTER TABLE 表名
  18. MODIFY 字段名 数据类型 [完整性约束条件…];
  19. ALTER TABLE 表名
  20. CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
  1.   六\\复制表
  1. # 查询语句执行的结果也是一张表,可以看成虚拟表
  2.  
  3. # 复制表结构+记录 (key不会复制: 主键、外键和索引)
  4. create table new_service select * from service;
  5.  
  6. # 只复制表结构
  7. select * from service where 1=2; //条件为假,查不到任何记录
  8.  
  9. create table new1_service select * from service where 1=2;
  10.  
  11. create table t4 like employees;

  七\\作业

 练习:账号信息表,用户组,主机表,主机组

  1. #用户表
  2. create table user(
  3. id int not null unique auto_increment,
  4. username varchar(20) not null,
  5. password varchar(50) not null,
  6. primary key(username,password)
  7. );
  8.  
  9. #用户组表
  10. create table usergroup(
  11. id int primary key auto_increment,
  12. groupname varchar(20) not null unique
  13. );
  14.  
  15. #主机表
  16. create table host(
  17. id int primary key auto_increment,
  18. ip char(15) not null unique default '127.0.0.1'
  19. );
  20.  
  21. #业务线表
  22. create table business(
  23. id int primary key auto_increment,
  24. business varchar(20) not null unique
  25. );
  26.  
  27. #建关系:user与usergroup
  28.  
  29. create table user2usergroup(
  30. id int not null unique auto_increment,
  31. user_id int not null,
  32. group_id int not null,
  33. primary key(user_id,group_id),
  34. foreign key(user_id) references user(id),
  35. foreign key(group_id) references usergroup(id)
  36. );
  37.  
  38. #建关系:host与business
  39. create table host2business(
  40. id int not null unique auto_increment,
  41. host_id int not null,
  42. business_id int not null,
  43. primary key(host_id,business_id),
  44. foreign key(host_id) references host(id),
  45. foreign key(business_id) references business(id)
  46. );
  47.  
  48. #建关系:user与host
  49. create table user2host(
  50. id int not null unique auto_increment,
  51. user_id int not null,
  52. host_id int not null,
  53. primary key(user_id,host_id),
  54. foreign key(user_id) references user(id),
  55. foreign key(host_id) references host(id)
  56. );

  练习:

  1. # 班级表
  2. cid caption
  3. # 学生表
  4. sid sname gender class_id
  5. # 老师表
  6. tid tname
  7. # 课程表
  8. cid cname teacher_id
  9. # 成绩表
  10. sid student_id course_id number

MySQL之Foreign_Key的更多相关文章

  1. Web项目从Oracle转为Mysql,fluentnhibernate-1.0和NHibernate2.1.0升级到NHibernate3.3的注意事项

    1.Oracel数据库没有字段自增长属性,要实现自增长通常是通过查询序列或者触发器来实现的. 设置自增长主键 alter table SUB_SUBSCRIPTION add primary key( ...

  2. ThinkPHP第十一天(关联模型使用,独立分组配置,MySQL concat用法)

    1.关联模型的使用 定义方式:新建一个类文件UserRelationModel.class.php Class UserRelationModel extends RelationModel{ pro ...

  3. 数据库 MYSQL操作(一)

    数据库  MYSQL操作总结(一) 本文主要介绍一下笔者在使用数据库操作的过程中的一些总结,主要的内容包括一下几个内容: 一.mysql 使用基础(主要包括数据库的安装.基本操作等内容) 二.mysq ...

  4. MySQL and Sql Server:Getting metadata using sql script (SQL-92 standard)

    MySQL: use sakila; -- show fields from table_name; -- show keys from table_name; SELECT `REFERENCED_ ...

  5. 14.python与数据库之mysql:pymysql、sqlalchemy

    相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...

  6. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  7. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  8. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  9. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

随机推荐

  1. Java 使用反射给属性赋值

    package com.nf147.manage.spring; import java.lang.reflect.Field; public class Cat { private String n ...

  2. selectKey 标签

    原文: https://blog.csdn.net/Sun_of_Rainy/article/details/81564433 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数 ...

  3. SQL Server database mail问题诊断一例

    产品环境sql server database的mail发不出邮件,影响客户的业务,在数据库中进行诊断 诊断sql: EXEC msdb.dbo.sp_send_dbmail @profile_nam ...

  4. centos下面配置key登录

    centos下需要配置使用key登录,并且要禁止root登录 下面的操作都是用root来设置的 1.添加新用户 例如用户名leisiyuan useradd leisiyuan 2.设置密码 pass ...

  5. mappers:将sql映射注册到全局配置中

    <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <!-- 6.mappers: ...

  6. vs2010 setup 打包 安装 BAT批处理实现自动安装软件功能

    CLS@echo offECHO.ECHO 安装 Diskeeper 7.0.428ECHO 请稍等...start /wait %systemdrive%\install\Applications\ ...

  7. 有关MSSQL2000在Win7上的安装

    https://baijiahao.baidu.com/s?id=1593533837896849226&wfr=spider&for=pc 怎么在win7下安装sql server2 ...

  8. Linux几个命令的升级替代品

    grep => ack, agack和ag是两个文本搜索工具,比自带的grep要好用得多.在指定目录下搜索文本时,它们不需要像grep那样指定各种命令行选项,输出结果也会包含文件名和行号,并且会 ...

  9. Servlet 响应 响应相关与重定向 请求 获取表单数据2种方法

    一.HttpServletResponse  (响应) 包括下面三个: 1.响应消息行  HTTP/1.1  200 OK 200是HTTP状态码, 代表请求已成功. (查httpservletres ...

  10. 【Qt开发】如何将内存图像数据封装成QImage V1

    如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放.旋转)操作.如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像 ...