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. 取值函数(getter)和存值函数(setter)

    todo get和set关键字

  2. [LeetCode]-DataBase-Customers Who Never Order

    Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...

  3. JavaWEB开发03——JS

    今日任务 使用JS完成页面定时弹出广告 使用JS完成表单的校验 使用JS完成表格的隔行换色 使用JS完成复选框的全选效果 使用JS完成省市的联动效果 JS控制下拉列表左右选择 教学导航 掌握JS中的B ...

  4. python面向对象之封装,多态与继承

    一.继承,包括单继承和多继承 对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类 仅需继承父类而不必一一实现每个方法. 实例: #coding=utf-8 class Person( ...

  5. sensu

    https://blog.csdn.net/enweitech/article/details/53763324

  6. 使用MingGW-w64 Build Script 3.6.7搭建ffmpeg编译环境

    在Linux下编译的Windows版本ffmpeg没有其他的依赖库 使用的是centos 1.脚本下载 wget http://zeranoe.com/scripts/mingw_w64_build/ ...

  7. p3863 序列

    分析 按照时间为下标分块 块内按照大小排序 每次整块整体修改半块暴力重构即可 代码 #include<bits/stdc++.h> using namespace std; #define ...

  8. LoadRunner11安装及破解

    一.LoadRunner11安装 以管理员身份运行setup.exe 选择第一个LoadRunner完整安装程序 按照界面会弹出以上提示框,直接选择否 检查系统缺少哪些组件,点击“确定”自动安装 点击 ...

  9. ArchLinux下XFCE的一个问题修复:thunar加载的环境变量不正确

    家里的电脑上,安装了Arch32与Arch64.不记得以前做过什么操作, 导致在Arch32下,Thunar启动后,其环境变量缺失很多内容. 主要在PATH及LD_LIBRARY_PATH几个关键变量 ...

  10. 安装docker-下载加速、失败、成功安装

    前提:已装VMware虚拟机和Centos系统(具体安装包和过程可以百度) 先看这里:非root身份登录系统需要在下面的命令前加“sudo ”(sudo:代表给权限,用root登录则不需要输入) 一. ...