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. 3.并发编程-ReentrantLock 细节说明

    并发编程-ReentrantLock 细节说明 ---title: 并发编程-ReentrantLock 细节说明date: 2018-07-05 09:06:57categories: - 并发编程 ...

  2. 如何解决tomcat9.0.14启动时控制台中出现乱码

    把/conf/logging.properties里的java.util.logging.ConsoleHandler.encoding= UTF-8改成java.util.logging.Conso ...

  3. 基于代理的数据库分库分表框架 Mycat实践

    192.168.199.75 MySQL . MyCAT master 192.168.199.74 MySQL slave 192.168.199.76 MySQL standby master 如 ...

  4. 你知道 Git 是如何做版本控制的吗?(转)

    总结:阅读这篇文章需要20分钟 本文是转载自 滴滴WebApp架构组 的一篇文章,文章讲解了神秘的.git目录下的一些文件,最终阐述了git是如何存储数据,及git分支的相关内容. git如何存储数据 ...

  5. 阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_2 回顾自定义mybatis的流程分析

  6. c++ 调用 sqlcipher

    #include <iostream> #include <string.h> #include "sqlite3.h" using namespace s ...

  7. python的浅复制,深复制

    1.a = b是将b的id复制给b,然后a与b指向同一个对象 import numpy as np a = np.arange(5) print(a) b = a print(id(a)) print ...

  8. MathType的配置问题;将word中的公式转换为mathtype格式失败,缺少OMML2MML.XSL

    安装MathType后打开word报错 打开会出现以下问题: 首先,把startup添加到word的信任中心: 要确保路径被office信任.依次打开word->文件->选项->信任 ...

  9. MySql 性能优化之 Explain

    MySQL 之 Explain 输出分析 背景 前面的文章写过 MySQL 的事务和锁,这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中多多少少都会接触过这个.可能工作中实 ...

  10. [Git] 022 没有人是一座孤岛

    0.回顾 [Git] 015 远程仓库篇 第二话 关联与推送 的 "2" 中介绍过 git remote git remote -v 与 "status" 不同 ...