MySQL创表关系之一对一、一对多、多对多

一、约束条件之主键

Primary Key 主键

  1. 单子从约束角度来看主键等于非空且唯一 not null unique
	create table t1(id int primary key, name varchar(32));

在这里插入图片描述

  1. InnoDB存储引擎规定一张表必须有一个主键且只有一个主键
    如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键
    (逐渐主要适用于来加快数据查询相当于一本书的目录)
  2. 如果创建的表中没有主键但是有非空且唯一的字段 那么InnoDB存储引擎会自动将该字段设置为主键
    在这里插入图片描述
	补充知识
		id int primary key 		# 单列主键
		sid int
		nid int primary key(sid,nid) # 联合主键 也属于单列主键比较冷门

4. auto_increment 自增
该约束条件不能单独使用 必须要跟在键后面(主要配合主键一起使用)

	create table t3(id int auto_increment); 	# 需要配合主键一起使用

在这里插入图片描述

	create table t3(id int primary key auto_increment, name varchar(32);

在这里插入图片描述

我们发现auto_increment有自增的特点 但是自增的操作不会因为删除数据完之后而重置从1开始

在这里插入图片描述

但是如果非要重置主键 需要格式化表 Truncate 表名; # 删除表数据并重置主键值

在这里插入图片描述

二、约束条件之外键(一对多)

前戏(一张员工表格)
在这里插入图片描述

		上述表述的缺陷
			1.表结构不清晰 到底是员工表还是部门表(说都是都不过分)
		   	2.字段数据反复存取 浪费存储空间(新增数据 数据一样)
		    3.表的扩展性极差 想修改一个数据表格全部改变复嘈杂
		优化操作
			1.拆表将员工分为一个表 部门分一个表
			2.但是拆完不知道谁是那个部门的了
			3.解决方案创建一个部门编号填写部门数据的主键值
		
		外键字段专门用于记录表于表之间的关系	

在这里插入图片描述

		外键字段主要是用来记录表于表之之间数据的关系 而数据的关系有四种
		一对多关系	多对多关系	一对一关系	没有关系
		如何判多表数据之间的关系判定呢?(换位思考)
		1.先站在员工表角度
			一名员工数据能否对应多条数据部门
				不行
		2.再站部门表角度
			一个部门能否拥有多个员工
				可以
		完成关系判定之后得出结果 一个可以一个不可以 那么关系就是一对多
		针对一对多的关系 外键字段键在多的一方(没有多对一 统称为一对多)
	1.先写普通字段
	2.然后在写外键字段

	create table user_txt(id int primary key auto_increment,
						  name varchar(32),
						  gender enum('male','female','others') default 'male',
						  dep_id int,
						  foreign key(dep_id) references dep_txt(id));
	create table dep_txt(id int primary key auto_increment,
						 position varchar(32),
						 target varchar(32));	
						 

在这里插入图片描述

创建表的时候需要先创建被关联的表(没有外键) 然后再是关联表(有外键)否则报错

在这里插入图片描述

插入表数据的时候 针对外键字段只能填写被关联表字段已经出现过的数据值

在这里插入图片描述

被关联字段无法修改和删除 有点不太好 操作限制性太强

在这里插入图片描述
这个时候我们就需要用到新的功能 级联更新、级联删除(被关联的数据一旦变动 关联的数据同步变动)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在实际工作中 很多时候可能并不会使用外键 因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
我们为了能够描述出表数据的关系 又不想使用外键 自己通过写SQL 建立代码层面的关系

三、表关系之多对多

		以书籍表和作者表为例
		1.一本书的作者可以对应多个作者吗?
			可以
		2.一个作者可以队友多本数据吗?
			可以
		两边都可以 那么表数据关系就是 多对多(针对多对多关系 外键字段不能建在任意一表)
	1.先写普通字段
	2.然后在写外键字段
		create table book(id int primary key auto_increment,
			           	title varchar(32),
			            author_id int,
			            foreign key(author_id) references author(id) 
			            on update cascade  # 级联更新 
			            on delete cascade  # 级联删除);
       create table author(id int primary key auto_increment,	
			            name varchar(32),
			            book_id int,
			            foreign key(book_id) references book(id) 
			            on update cascade  # 级联更新 
			            on delete cascade  # 级联删除);

在这里插入图片描述

       但是发现两个数据在互相谦让 都没有创建成功 所以多对多不能在原表修改
       需要使用到固定套路 需要单独开设第三张关系表 多个关系也不能全部放在一个ID表格里面了
       所以数据表格也变成一行一行的

在这里插入图片描述

	需要单独开设出第三张关系表 存储数据关系
		 create table book(
		      	id int primary key auto_increment,
		        title varchar(32));
	     create table author(
	     		id int primary key auto_increment,
	         	name varchar(32));
	  	 create 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  # 级联删除);

在这里插入图片描述

四、表关系之一对一

	以用户表和用户详情表为例
	1.一个用户可以拥有多个信息不?
	2.一个信息可以指定多个用户不
	两边答案都不可以 那么先考虑是不是没有关系 如果有关系那么肯定是一对一
	针对一对一的表关系 外键字段建在任何一张表都可以
	(但是建议建在查询频率较高的表中便于后续查询)

在这里插入图片描述

		create table user(id int primary key auto_increment,
					       name varchar(32)
					       detail_id int unique,	# unique 唯一
					       foreign key(detail_id) references userDetail(id) 
					       on update cascade  # 级联更新 
					       on delete cascade  # 级联删除);
		create table userDetail(id int primary key auto_increment,
					       phone bigint);
		'''与多对一不一样的就是多一个 unique唯一约束条件  使用过就不能再次使用'''

在这里插入图片描述

技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点点赞收藏+关注 谢谢支持 !!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoisMay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值