mysql数据库 day03
---恢复内容开始---
1.外键(重点)
2.修改表的完整语句(了解知识点)
一.外键
外键一共分为三大类:一对多,多对多,一对一
1.一对多:
为什么要有这些外键了:
比如说定义了一张员工表
# 定义一张部门员工表 id name gender dep_name dep_desc 1 jason male 教学部 教书育人 2 egon male 外交部 漂泊游荡 3 tank male 教学部 教书育人 4 kevin male 教学部 教书育人 5 owen female 技术部 技术能力有限部门
那么这张表有什么问题 ?:
把所有的数据都存放在一张表的弊端: 1.表的结构不清晰 2.浪费硬盘空间(因为有相同的部门,需要重复写) 3.表的扩展性极差(无法忽略的缺点)这个问题就类似我们将所有的代码都写在用一个py文件内
那么我们该怎么解决这个问题:(我们要把表分开,解耦和)
emp
id | emp_name | emp_gender | dep_id |
1 | jason | male | 1 |
2 | egon | female | 2 |
3 | tank | male | 2 |
4 | jerry | male | 2 |
5 | kevin | male | 3 |
dep
id | dep_name | dep_desc |
1 | 外交部 | 形象代言人 |
2 | 教学部 | 教书育人 |
3 | 技术部 | 技术能力有限部门 |
表示解耦和了,那么该如何确定这俩张表是什么关系:
确立表与表之间的关系 一定要换位思考(必须两方都考虑周全之后才能得出结论) 以员工表和部门表为例先站在员工表看能否有多个员工对应一个部门 翻译过来:一个部门能否有多个员工 可以!!!(暂时只能确定员工单向多对一部门)再站在部门表看能否有多个部门对应一个员工 翻译过来:一个员工能否属于多个部门 不可以!!!由此得出的结论就是: 员工表和部门表之间仅仅是单向的多对一,那么他们的关系就是!!一对多!!, 表关系中没有!多对一!这么一说,只有一对多那么该如何让俩张表有代码上的关联,这就必须使用外键了: 什么是外键:就是让表与表之间有硬性上的关系该如何使用: foreign key 外键约束 1.在创建表的时候 必须先创建被关联表 2.插入数据的时候 也必须先插入被关联表的数据
代码实现:
1 create table dep( 2 id int primary key auto_increment, 3 dep_name varchar(32), 4 dep_desc varchar(128) 5 ); 6 7 8 create table emp( 9 id int primary key auto_increment, 10 emp_name varchar(64), 11 emp_gender enum('male','female','others') default 'male', 12 dep_id int, 13 foreign key(dep_id) references dep(id) 14 on update cascade 级联更新级联删除 15 on delete cascade 16 ); 17 18 19 insert into dep(dep_name,dep_desc) values('外交部','搞外交'), 20 ('教学部','教书育人'), 21 ('技术部','技术能力有限部门') 22 ; 23 24 25 insert into emp(emp_name,dep_id) values('jason',1), 26 ('egon',2), 27 ('tank',2), 28 ('kevin',3);
View Code
注意点:
修改表数据: update dep set id=200 where id=1; update emp set dep=300 where =1; 现在还不能修改表里的数据,需要在外键后面加上 2行代码 on update cascade 级联更行 on delete cascade 级联删除注意:外键虽然能够帮你强制建立表的关系,但是也会给表之间增加数据的相关的约束1.删除数据的时候,需要先删员工表的数据,再删部门表的数据(因为员工表设置了外键,你要是先删部门了,那么员工表的外键序号是不存在的) delete from emp where id = 4; delete from dep where id = 3;1。受限于外键约束,导致操作数据变得非常复杂,能否有一张简单的方式,让我不需要考虑在操作目标表的时候还需要考虑关联表的情况,比如我删除部门,那么这个部门对应的员工就应该跟着立即清空2.更新于删除都需要考虑到关联与被关联的关系>>>同步更新与同步删除这里就需要用到 级联更新级联删除删除部门后,对应的部门里面的员工表数据对应删除 更新部门后,对应员工表中的标示部门的字段同步更新
2.多对多
分析多对多表的关系:
多对多表的关联关系:可以比喻为 图书表与作者表(记住一定要换位思考)先站在图书表来看:多本书能否有一个作者 可以!!一本书能否有多个作者 可以!!再站在作者表来看:多个作者能否合写一本书 可以!!一本书能否有多个作者 可以!!如果双方都是可以,那么就是多对多的关系
不逼逼了,看图吧:
book
id | title | price | desc |
1 | 精品美 | 999 | 小黄书 |
2 | python从入门到放弃 | 1000 | 教你如何从小白变成屌丝 |
3 | 聊斋志异 | 6969 | 带你看鬼 |
author
id | name | age |
1 | jason | 18 |
2 | egon | 19 |
那么代码我们该如何实现:
先来想如何创建表?图书表需要有一个外键关联作者,作者也需要有一个外键字段关联图书。问题来了,先创建谁都不合适!如何解决?因为创建外键的时候,需要一个被关联的id
解决:
记住,多对多关系的建立,必须手动创建第三张表,用来专门记录俩种表之间的关系。
先建俩种普通的表,不需要设置外键
注意:
重点在第三张表上,设置2个id字段,每个字段下面设置外键
代码实现:
1 create table book( 2 id int primary key auto_increment, 3 title varchar(32), 4 price int 5 ); 6 create table author( 7 id int primary key auto_increment, 8 name varchar(32), 9 age int 10 ); 11 create table book2author( 12 id int primary key auto_increment, 13 book_id int, 14 foreign key(book_id) references book(id) 15 on update cascade 16 on delete cascade, 17 author_id int, 18 foreign key(author_id) references author(id) 19 on update cascade 20 on delete cascade 21 ); 22 23 insert into book(title,price) values('精品美',199),('聊斋',299),('jason教你删别人的库,让别人跑去吧',1); 24 25 26 insert into author(name,age) values('jason',18),('tank',38); 27 28 29 insert into book2author(book_id,author_id) values(4,3); # 报错 30 insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2); 31
View Code
3.一对一表的关系
1.一对一的场景,当你的表的数据非常庞大的时候,你可以考虑拆分表 2.联想老男孩的客户和学生 user id name age userdetail(用户详细信息) hobby addr ICDard 当你没有交学费之前 ,你是老男孩的客户 当你交了学费之后,你就变成老男孩的学生 问题来了: 难道只要是咨询的客户都会变成学生么???怎么可能 一对一就是一一对应,不能一对多,也不能多对多
注意!!
我们通常将关系字段,称之为外键字段
一对多的外键字段:建在多的一方
多对多的外键字段:建在第三张表里
一对一的外键字段:建在任意一方都可以,但是推荐你建在查询频率较高的一方
1 create table authordetail1( 2 id int primary key auto_increment, 3 phone int, 4 addr char(255) 5 6 ); 7 8 9 create table author1( 10 id int primary key auto_increment, 11 name char(4), 12 age int, 13 authordetail_id int unique, 14 foreign key(authordetail_id) references authordetail1(id) 15 on update cascade 16 on delete cascade 17 ); 18
View Code
总结:判断表关系的最简单的方法
图书与出版社一本书可不可以有多个出版社 不可以!!!一个出版社可不可以出版多本书 可以!!!一对多的关系图书与作者表一本书可不可以有多个作者 可以!!!一个作者可不可以写多本书 可以!!!多对多的关系作者与作者详情一个作者可不可以有多个详情 不可以!!!一个作者详情可不可以有多个作者 不可以!!!要么两者是一对一要么两者之间没任何关系
了解知识点:
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;
转载于:https://www.cnblogs.com/zahngyu/p/11384449.html
mysql数据库 day03相关推荐
- MySQL 数据库 day-03
三.常见函数 函数概念:将一组逻辑语句封装在方法体中,对外暴露方法名 好处:1.隐藏了实现细节 2.提高代码的重用性 调用:select 函数名(实参列表)[from 表]: 特点: 1.函数名 2. ...
- 【Bootstrap4前端框架+MySQL数据库】前后端综合实训【10天课程 博客汇总表 详细笔记】【附:所有代码】
目 录 日常要求.项目要求 用到的软件版本情况说明 上课时的所有代码.用到的软件安装包 实训第2周--前后端"新闻管理系统"工程所有文件(MySQL语句+eclipse项目) ...
- 《Mysql数据库》
一.MySql(MariDB) 学习数据库主要学习的是如何对数据进行增删改查操作. Mysql菜鸟教程:[https://www.runoob.com/mysql/mysql-tutorial.htm ...
- MySQL数据库学习教程,从0到入门
mysql day01课堂笔记 1.什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么? 数据库:英文单词DataBase,简称DB.按照一定格式存储数据的一些文件的组合.顾名思义 ...
- .net连接mysql数据_.net连接MYSQL数据库的方法及示例!
连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...
- MySQL数据库+命令大全+常用操作
格式:mysql -h主机地址 -u用户名 -p用户密码 1. 例:连接到本机上的MYSQL 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示 ...
- mysql数据库是一个软件呐_15款好用的mysql管理软件
1. Induction Induction是一款用于理解数据关系的开源管理工具,它可用来探索行/列,运行查询和数据可视化等方面.该工具支持多种数据库,包括PostgreSQL,MySQL,SQLit ...
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...
- C语言对mysql数据库的操作
C语言对mysql数据库的操作 原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎 ...
最新文章
- 【pytorch】StatScores的原理与使用
- 与vnpy相关的有用博客网址
- Hadoop 2.x 完全分布式HA集群环境搭建
- XPO 学习资料(转摘)
- 从集合中查找最值得方法——max(),min(),nlargest(),nsmallest()
- [翻译] NumSharp的数组切片功能 [:]
- flask中数据库的基本操作-增删改查【备忘】
- leetcode951. Flip Equivalent Binary Trees
- python3.7读取csv文件_Python3 读取csv文件
- canvas元素简易教程(7)(大部分转自火狐,自己只写了简单的代码分析)
- [emuch.net]MatrixComputations(7-12)
- [二分]TYVJ1359 收入计划
- 有量纲和无量纲是什么意思_为什么无线通信需要同步?
- 求会议安排的时间最大化(回溯法)
- 纳米数据世界杯足球基础数据,接口文档,接口api调试,数据接口演示
- 程序员有话说,只务正业就够了吗?
- 子组件向父组件传参的几种方法
- java学习中,DVD管理系统纯代码(java 学习中的小记录)
- 数据可视化 信息可视化_可视化数据操作数据可视化与纪录片的共同点
- 程序员年薪20万、30万、40万都是什么样的体验?
热门文章
- 案例三:执行 JavaScript 语句
- 多进程修改全局变量(python版)
- 用户登陆——数据库逻辑
- ASP.NET中使用JSON方便实现前台与后台的数据交换
- 如何得到发送邮件服务器地址(SMTP地址)
- wxPython4.0中ListCtrl入门
- 树莓派安装python2.7_树莓派3 + raspbian lite + OpenCV 3 环境搭建
- vs不一致的行尾对话框怎么调出_细分调漆步骤,新手师傅怎么轻松调漆
- 数字图像处理--微分算子为什么也是空间滤波器
- 透视变换--图像拼接