MySQL之Foreign_Key
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的更多相关文章
- Web项目从Oracle转为Mysql,fluentnhibernate-1.0和NHibernate2.1.0升级到NHibernate3.3的注意事项
1.Oracel数据库没有字段自增长属性,要实现自增长通常是通过查询序列或者触发器来实现的. 设置自增长主键 alter table SUB_SUBSCRIPTION add primary key( ...
- ThinkPHP第十一天(关联模型使用,独立分组配置,MySQL concat用法)
1.关联模型的使用 定义方式:新建一个类文件UserRelationModel.class.php Class UserRelationModel extends RelationModel{ pro ...
- 数据库 MYSQL操作(一)
数据库 MYSQL操作总结(一) 本文主要介绍一下笔者在使用数据库操作的过程中的一些总结,主要的内容包括一下几个内容: 一.mysql 使用基础(主要包括数据库的安装.基本操作等内容) 二.mysq ...
- 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_ ...
- 14.python与数据库之mysql:pymysql、sqlalchemy
相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
随机推荐
- (54)LINUX应用编程和网络编程之九Linux网络通信实践
3.9.1.linux网络编程框架 3.9.1.1.网络是分层的 (1)OSI 7层模型(理论指导) (2)网络为什么要分层 (3)网络分层的具体表现 3.9.1.2.TCP/IP协议引入(网络分层实 ...
- Burp suite抓取HTTPS请求
一.下载链接:Burp suite 密码:orpr 二.抓取浏览器HTTPS请求 1.打开CMD,进入到Burp suite下载路径,执行:java -jar BurpLoader.jar 2.点击 ...
- python中加入中文注释报错处理
python中加入中文注释,运行报错如下 解决方法: 在py文件的第一行加入 #coding:utf-8 即可
- android界面的滑动切换功能
左右滑动切换是几乎所有应用中都会用到的功能.在这里将相关资源进行总结 (1)viewflipper结合手势检测进行左右滑动. http://www.cnblogs.com/hanyonglu/arch ...
- 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)
目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...
- shell脚本之浮点数和整数计算
整数计算 直接使用放括号计算即可,省去*号需要使用转义符的麻烦 #!/bin/bash num1= num2= var1=$[ $num1 * $num2 ] echo "$var1&quo ...
- java执行命令行,以及解决卡死问题
java可以执行本地命令行,但是有一个坑,命令执行后,已经执行完毕,但是卡死不返回,这是因为: 命令会返回两个输出流,正确的返回流,和错误的返回流 一般程序的做法是先循环读正确的返回流,再读错误的返回 ...
- 在docker容器中调用docker命令
宿主容器均为CentOS7.6.1810 docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/run/docker.s ...
- Linux 下ThinkPHP项目出现_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Admin/0dfec61edd66f450033aa87c28a760f4.php
在Linux中部署了ThinkPHP项目,访问时却出现了_STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Admin/0dfec61edd66f450 ...
- JVM参数设置-jdk8参数设置
JVM参数设置 1.基本参数 参数名称 含义 默认值 -Xms 初始堆大小 内存的1/64 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx ...