MySQL之Foregin_Key

  一\\一对多

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

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

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

  建表# 被关联

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

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

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

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

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

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

  # 插入具体值到关联表

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

  二\\多对多

  多对多 思路:换为思考

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

建表:

  书籍表

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

  作者表

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

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

reate table book2author(id int primary key auto_increment,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade,
author_id int,
foreign key (author_id) references author(id)
on update cascade
on delete cascade);
# 注意完整的一句话哈

  #开始在表中插入数据

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

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

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

  三\\一对一

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

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

  比如一个人的信息表

  # 还是先建立被关联的表

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

  # 注意:括号 完整性

  # 关联表 注意唯一性 unique

create table author1(id int primary key auto_increment,
name varchar(32),
age int,
authordetail_id int unique,
foreign key(authordetail_id) references authordetail(id)
on update cascade
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.修改表的完整语句
1. 修改表名
ALTER TABLE 表名
RENAME 新表名;
2. 增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 直接移到最前面
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 寻找插哪个字段的后面
3. 删除字段
ALTER TABLE 表名
DROP 字段名;
4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
  六\\复制表

# 查询语句执行的结果也是一张表,可以看成虚拟表

            # 复制表结构+记录 (key不会复制: 主键、外键和索引)
create table new_service select * from service; # 只复制表结构
select * from service where 1=2; //条件为假,查不到任何记录 create table new1_service select * from service where 1=2; create table t4 like employees;

  七\\作业

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

#用户表
create table user(
id int not null unique auto_increment,
username varchar(20) not null,
password varchar(50) not null,
primary key(username,password)
); #用户组表
create table usergroup(
id int primary key auto_increment,
groupname varchar(20) not null unique
); #主机表
create table host(
id int primary key auto_increment,
ip char(15) not null unique default '127.0.0.1'
); #业务线表
create table business(
id int primary key auto_increment,
business varchar(20) not null unique
); #建关系:user与usergroup create table user2usergroup(
id int not null unique auto_increment,
user_id int not null,
group_id int not null,
primary key(user_id,group_id),
foreign key(user_id) references user(id),
foreign key(group_id) references usergroup(id)
); #建关系:host与business
create table host2business(
id int not null unique auto_increment,
host_id int not null,
business_id int not null,
primary key(host_id,business_id),
foreign key(host_id) references host(id),
foreign key(business_id) references business(id)
); #建关系:user与host
create table user2host(
id int not null unique auto_increment,
user_id int not null,
host_id int not null,
primary key(user_id,host_id),
foreign key(user_id) references user(id),
foreign key(host_id) references host(id)
);

  练习:

# 班级表
cid caption
# 学生表
sid sname gender class_id
# 老师表
tid tname
# 课程表
cid cname teacher_id
# 成绩表
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. (54)LINUX应用编程和网络编程之九Linux网络通信实践

    3.9.1.linux网络编程框架 3.9.1.1.网络是分层的 (1)OSI 7层模型(理论指导) (2)网络为什么要分层 (3)网络分层的具体表现 3.9.1.2.TCP/IP协议引入(网络分层实 ...

  2. Burp suite抓取HTTPS请求

    一.下载链接:Burp suite 密码:orpr 二.抓取浏览器HTTPS请求 1.打开CMD,进入到Burp suite下载路径,执行:java -jar BurpLoader.jar 2.点击 ...

  3. python中加入中文注释报错处理

    python中加入中文注释,运行报错如下 解决方法: 在py文件的第一行加入   #coding:utf-8  即可

  4. android界面的滑动切换功能

    左右滑动切换是几乎所有应用中都会用到的功能.在这里将相关资源进行总结 (1)viewflipper结合手势检测进行左右滑动. http://www.cnblogs.com/hanyonglu/arch ...

  5. 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)

    目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...

  6. shell脚本之浮点数和整数计算

    整数计算 直接使用放括号计算即可,省去*号需要使用转义符的麻烦 #!/bin/bash num1= num2= var1=$[ $num1 * $num2 ] echo "$var1&quo ...

  7. java执行命令行,以及解决卡死问题

    java可以执行本地命令行,但是有一个坑,命令执行后,已经执行完毕,但是卡死不返回,这是因为: 命令会返回两个输出流,正确的返回流,和错误的返回流 一般程序的做法是先循环读正确的返回流,再读错误的返回 ...

  8. 在docker容器中调用docker命令

    宿主容器均为CentOS7.6.1810 docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/run/docker.s ...

  9. Linux 下ThinkPHP项目出现_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Admin/0dfec61edd66f450033aa87c28a760f4.php

    在Linux中部署了ThinkPHP项目,访问时却出现了_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Admin/0dfec61edd66f450 ...

  10. JVM参数设置-jdk8参数设置

    JVM参数设置 1.基本参数 参数名称 含义 默认值   -Xms 初始堆大小 内存的1/64 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx ...