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 ...
随机推荐
- Java 使用反射给属性赋值
package com.nf147.manage.spring; import java.lang.reflect.Field; public class Cat { private String n ...
- selectKey 标签
原文: https://blog.csdn.net/Sun_of_Rainy/article/details/81564433 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数 ...
- SQL Server database mail问题诊断一例
产品环境sql server database的mail发不出邮件,影响客户的业务,在数据库中进行诊断 诊断sql: EXEC msdb.dbo.sp_send_dbmail @profile_nam ...
- centos下面配置key登录
centos下需要配置使用key登录,并且要禁止root登录 下面的操作都是用root来设置的 1.添加新用户 例如用户名leisiyuan useradd leisiyuan 2.设置密码 pass ...
- mappers:将sql映射注册到全局配置中
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <!-- 6.mappers: ...
- vs2010 setup 打包 安装 BAT批处理实现自动安装软件功能
CLS@echo offECHO.ECHO 安装 Diskeeper 7.0.428ECHO 请稍等...start /wait %systemdrive%\install\Applications\ ...
- 有关MSSQL2000在Win7上的安装
https://baijiahao.baidu.com/s?id=1593533837896849226&wfr=spider&for=pc 怎么在win7下安装sql server2 ...
- Linux几个命令的升级替代品
grep => ack, agack和ag是两个文本搜索工具,比自带的grep要好用得多.在指定目录下搜索文本时,它们不需要像grep那样指定各种命令行选项,输出结果也会包含文件名和行号,并且会 ...
- Servlet 响应 响应相关与重定向 请求 获取表单数据2种方法
一.HttpServletResponse (响应) 包括下面三个: 1.响应消息行 HTTP/1.1 200 OK 200是HTTP状态码, 代表请求已成功. (查httpservletres ...
- 【Qt开发】如何将内存图像数据封装成QImage V1
如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放.旋转)操作.如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像 ...