1. 表与表之间的关系:一对多;一对一;多对多;

表与表之间怎么建立一对一的关系呢,可以使用外键约束+唯一约束;

有两种方式:

1.利用主键,一张表的主键只能有一个,所以这张表就可以满足唯一,另一张表跟前面那张表的主键关联的字段设置为外键,并且该外键字段设置为唯一字段(也就是当两张表关联的两个字段之一是一张表的主键,则另一张表相应字段设置为外键+唯一约束即可);---用户-博客表(假设一个用户只能有一个博客)

2. 外键与普通字段:普通字段加唯一约束,外键字段设置为外键 加唯一约束,也就是如果是两张表的关联字段都不是主键,则两张表的一张表关联字段设置为唯一约束,另一张表的关联字段设置为外键约束(外键必须是前一张表的主键)+唯一约束----身份证 -人员信息表;

2. 一对多:  (一的表正常创建,多的表关联字段添加外键)

2.1 场景: 人-汽车表(一个人可以拥有很多部汽车) person表就是一,汽车表就是多, 另外创建一的那张表就正常创建,设置主键就好了;而多那张表需要设置外键约束(跟前面那张表的主键约束);

首先创建人员信息表:

create table person(id varchar(10) not null PRIMARY key,  # 人员信息表的主键 其实是跟car表关联的字段name varchar(20) not null,age int not null,sex int not null)alter table person modify sex char(2) not null;insert into person values("P0001","西西",22,"女");
insert into person values("P0002","东东",23,"男");
insert into person values("P0003","楠楠",24,"女");select * from person;

运行结果:

设计汽车表(多:外键约束)

create table car(cid varchar(10) not null primary key, # car表中的主键name varchar(20) not null default "大众" ,p_id varchar(10) not null,  # car表中跟person表中关联的字段,需要设置为外键约束constraint fk_pid foreign key(p_id) references person(id))    # 设置为外键约束(关联另一张表person的主键id)insert into car values("c0001","大众","P0001"); # 这两个车都是属于同一个人P0001
insert into car values("c0002","奔驰","P0001"); # 这两个车都是属于同一个人P0001
insert into car values("c0003","奥迪","P0002"); # c0002车属于P0002这个人
insert into car values("c0004","奥迪","P0003");
select * from car;

运行结果:

这样person表和car表就建立了一对多的关系,person表的id 是该表的主键,也是跟car这张表的关联字段,car这张表也有一个主角,就是car的id,但是car这张表的p-id就是所属人id 代表这个车属于哪个车主,需要设置为外键约束(这样car这种表的p-id  多条数据可以具有相同的p-id 表示多辆车具有相同的车主,一个人拥有多部车)

2.2 场景: 班级-学生表,一个班级可以对应很多学生,就是一对多,所以class 表正常建立,student表需要对关联字段创建外键约束;

创建班级表(一,需要设置主键,并且这个主键是两张表的关联字段)

create table class(id varchar(10) not null primary key,  # 班级id设置为主键,其实也是两张表的关联字段c_name varchar(30) not null)insert into class values("C0001","python课程班级");
insert into class values("C0002","java课程班级");
select * from class;

运行结果:

创建学生表(多,需要对关联字段-就是学生表中需要记录该名学生属于哪个班级,添加外键约束)

create table student(id varchar(10) not null primary key,name varchar(30) not null,age int not null default 22,sex char(2) not null default "女",c_id varchar(20) not null,   # student表中的外键,关联的是class表中的班级id(主键)所以多student表中添加外键约束即可;constraint fk_student_cid foreign key(c_id) references class(id)  # 对student表中的c_id设置外键约束,关联的是class表的班级id# 需要注意 student表的外键c-id 必须跟class表的主键id数据类型一样~~
)
insert into student values("S0001","西西",22,"女","C0001");  # S0001 S0002属于同一个班级,student表的c-id字段可以重复(也就是多)
insert into student values("S0002","静静",23,"女","C0001");
insert into student values("S0003","东东",24,"男","C0002");
insert into student values("S0004","二狗子",25,"男","C0002");select * from student;

运行结果:

这样两张表就建立了一对多的关系,class的id 是主键唯一,student表的关联字段是c-id 需要设置为外键 这样student表的c-id就可以多条数据具有相同的值,也就是很多个学生可以同属于一个班级(一个班级具有很多学生--一对多)

3. 一对一

表与表之间一对一的约束关系有两种创建方法:

1. 普通字段(code)加唯一约束,关联字段(c_id)设置为外键约束加唯一约束(比如人 身份证两张表 需要表示的是一个人有一个身份证号码,但是在card表中id是主键,身份证号是普通字段,所以card表需要设置普通字段code的唯一约束,另外person表需要id就是设置为主键,但是person表需要记录身份证的信息,也就是需要给一个关联字段,关联字段又只能跟别的表的主键关联作为外键,所以person表关联字段需要设置外键+唯一约束

2. 两张表的一其中一个是主键,另外一张表设置为外键约束和唯一约束(区别就是一是主键的那张表 不需要设置普通字段为唯一约束,因为一本来就是主键,主键本来就唯一)

3.1 场景:每一个人都只拥有一个身份证;

需要创建两张表 person人员信息表,具有id name age sex p_code (就是人员信息表都得记录每一个人所具有的身份证号的信息----这里是根据身份证card表的id来关联的,card表的id就是主键,然后code有设置为unique 所以一个id就对应一个code编号,所以在person表中查找id也能唯一的找到code) ,另一张表就是身份证信息的表 包含id code (身份证编号)   这两张表就是一对一的关系,也就是person表的c-id需要设置为外键+唯一约束,card表的code普通字段需要添加唯一约束;

创建身份证信息表card表(id 是主键(另一张表person的c-id需要关联的字段),code:普通字段,需添加唯一约束):

create table card(id varchar(10) not null primary key,  # card 表的主键,person表c_id的关联字段(主键和外键数据类型必须一样,其实就是一个东西,只是在两张表中都出现)code varchar(20) not null unique    # 需要为普通字段添加唯一约束,因为一对一指的就是card的code普通字段 还有person表的c-id 外键+唯一约束
)insert into card values("C0001","129304903940");
insert into card values("C0002","232392039094");
insert into card values("C0003","403903403283");  # 三条不同的身份证信息
select * from card;

运行结果:

创建身份证信息表:

create table person_info(id varchar(10) not null primary key,  # person表的主键name varchar(20) not null,age int not null default 22,sex char(2) not null default "女",c_id varchar(10) not null unique, # 跟card表的主键id关联的字段,需要添加外键和唯一约束的constraint fk_person_cid foreign key(c_id) references card(id))insert into person_info values("P0001","西西",22,"女","C0003");   # P0001 对应的身份证信息是C0003那条数据;
insert into person_info values("P0002","楠楠",24,"男","C0001");
insert into person_info values("P0003","宝宝",23,"女","C0002");
select * from person_info;

运行结果:

这样两张表person表和card表就通过person表的c_id外键约束+唯一约束 跟 card表的id 主键关联 与card表的code普通字段(添加唯一约束)建立了一对一的关系;

3.2  场景:假设一个用户只能有一个博客:

一张表设置主键(表的一) 另一张表外键约束+唯一约束(另一张表的一)

(其实我觉得这两张表的建立可以跟身份证信息表建立思路是一样的,就是首先创建 博客表(普通字段添加唯一约束) 然后创建人员信息表,主键id 关联字段就是人员信息表的blog-id 设置为博客表主键id的外键,并且添加唯一约束 我觉得这样也行其实,,,,)

先创建人员信息表:

create table user(id varchar(10) not null primary key,name varchar(20) not null)insert into user values("U0001","西西");
insert into user values("U0002","东东");
select * from USER;

运行结果:

创建blog表:

create table blog(id varchar(10) not null primary key,name varchar(20) not null, user_id varchar(10) not null unique,  -- 两张表的关联字段,设置为外键(关联的是user表的主键id,通过外键user-id就可以唯一找到这个人constraint blog_userid foreign key(user_id) references user(id))  -- 需要为外键添加唯一约束(这样两张表就建立一对一的关系)
insert into blog values("B0001","璇璇是小仙女呀","U0002");  # 这个博客是U0002用户的
insert into blog values("B0002","小仙女哈哈哈哈","U0001");select * from blog;

运行结果:

4. 多对多:(如果是两张表之间多对多,一般需要建立三张表,两张独立的实体表,另外一张可以建立两张表关联的关系表)

4.1 场景: 学生选课,一个学生可以选很多门课,每门课可以提供很多学生选择;

一般我们需要创建三张表,两张实体表,就是独立的学生表和课程表,另外一个就是关系表,相当于两张多对多是体表的桥梁;

首先创建实体表学生表:

create table student_info(id varchar(10) not null primary key,name varchar(20) not null,age int not null,sex char(2) not null
)insert into student_info values("S0001","璇璇",22,"女");
insert into student_info values("S0002","西西",23,"女");
insert into student_info values("S0003","东东",24,"男");
insert into student_info values("S0004","楠楠",25,"男");select * from student_info;

运行结果:

 创建实体表课程表:

create table course(id varchar(10) not null primary key,name varchar(10) not null)insert into course values("C0001","python课程");
insert into course values("C0002","java课程");
insert into course values("C0003","c++课程");select * from course;

运行结果:

创建关系表(反映两张实体表多对多关系的关系表):

create table relation_info(s_id varchar(10) not null,c_id varchar(10) not null,primary key(s_id,c_id),   # 将s_id 与 c_id设置为联合主键 分别指的是student_info表的学生id 以及course表的课程idconstraint fk_relation_info_sid foreign key(s_id) references student_info(id),  # 为关系表中的两个字段(其实就是另外两张表的主键,添加外键约束)constraint fk_relation_info_cid foreign key(c_id) references course(id))insert into relation_info values("S0001","C0002");  # s00001选了C0002这门课
insert into relation_info values("S0001","C0003");
insert into relation_info values("S0001","C0001");
insert into relation_info values("S0003","C0001");
insert into relation_info values("S0003","C0002");
insert into relation_info values("S0003","C0003");
insert into relation_info values("S0002","C0002");
insert into relation_info values("S0002","C0003");select * from relation_info;

运行结果:

转载于:https://www.cnblogs.com/xuanxuanlove/p/9898527.html

python学习笔记 day44 表与表之间的关系相关推荐

  1. 设计模式学习笔记1——类与类之间的关系

    1.继承关系 概念 继承又分为2种方式,一种叫实现继承,一种叫接口继承.参见笔记--[2种继承方式学习笔记].(https://blog.csdn.net/yhb1206/article/detail ...

  2. Python学习笔记——openpyxl读取工作表的数据有效性设置信息

    今天在用openpyxl读取表格信息时,需要根据表格中单元格的数据有效性设置中的序列内容来进行下一步操作判断.但是对于如何获取该序列的字符串值一点也不了解,网上查找资料只找到用DataValidati ...

  3. python学习笔记 day44 数据库三范式

    参考自 https://www.cnblogs.com/wangfengming/articles/7929118.html 1. 数据库三范式概念: 为了建立减少冗余,结构合理的数据库,涉及数据库时 ...

  4. Linux学习笔记之权限与命令之间的关系(重要)及文件与目录知识总结

    一.让使用者能进入某目录成为可工作目录的基本权限为何: 可使用的命令:例如 cd 等变换工作目录的命令: 目录所需权限:使用者对这个目录至少需要具有 x的权限 额外需求:如果使用者想要在这个目录内利用 ...

  5. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  6. oracle复制另一个字段,【学习笔记】Oracle存储过程 表中列不同时动态复制表中数据到另一个表中...

    天萃荷净 分享一篇关于Oracle存储过程实现表之间数据复制功能.两表中列不同,动态的将一表中的数据复制到另一个表中案例 因为要用到回收站功能,删除一条记录,要先放到一个delete表中,以便以后恢复 ...

  7. MySQL学习笔记06【多表查询、子查询、多表查询练习】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  8. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  9. Python学习笔记:web开发1

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  10. Python学习笔记:数据库2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 单片机是否为嵌入式技术,单片机和嵌入式学哪个?
  2. 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入
  3. 【ASP.NET Core 沉思录】CreateWebHostBuilder 是一个 Convension
  4. 史上最全的HTML和CSS标签常用命名规则
  5. linux中向空文件写入内容,linux – 为什么写入现有文件比写一个新的空文件更快?...
  6. ASP.NET 实践:在非层次化控件中显示网站地图的数据
  7. repo打了 tag之后如何提交tag_技术开发者应该如何构建小团队的微服务方案?
  8. Exchange 2016 体系结构
  9. 翻译: 3.线性神经网络 概览 深入神经网络 pytorch
  10. android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
  11. java cobar_Cobar-Client 实现策略总结
  12. Autodesk CAD帮助文档 DXF 图层使用
  13. 什么是色彩管理,OPPO 全链路色彩管理全在哪?
  14. 方格取数(多线程dp,深搜)
  15. 八爪鱼爬取列表数据和详情页数据(国内网址)
  16. office365:PowerPoint新功能设计器,让排版更轻松
  17. echarts 旭日图sunburst
  18. C语言学习笔记22/08/21
  19. Python3.7学习笔记30-垃圾回收机制
  20. 保留已经定位区域MATLAB,基于HSV肤色提取与连通区域过滤的人脸定位算法(Matlab)...

热门文章

  1. 自己编写的新闻显示控件(列表显示不过不够完善还需努力)
  2. Ps2021教程,如何在photoshop中调整建筑物透视效果?
  3. 如何在 Safari 下载 ZIP 文件后不自动解压?
  4. 如何在 Mac 上的 Pages 文稿中格式化文本栏?
  5. 如何在 Mac、iphone 中快速清除已完成的提醒?
  6. Mac新手比较容易犯的一些错误
  7. Python爬虫(三)--百度贴吧
  8. 汇编---3---物理地址
  9. Map Reduce学习
  10. SQL Server的还原