python学习Day46


Day 46

今日内容概要

  • MySQL字段约束条件—主键
  • MySQL字段约束条件—外键
  • Foreign Key 外键字段
  • 表关系—多对多
  • 表关系—一对一

今日内容详细

1.MySQL字段约束条件—主键

image

1.primary key主键功能:
	1)单从约束角度上而言主键'等价于非空且唯一'(not null unique)
    	create table t1(
           id int primary key,
           name varchar(32)
        ); 
 	2)InnoDB存储引擎规定一张表必须'有且只有一个主键'
    	①.如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键(主键可以加快数据查询:新华字典的目录)
   		②.如果创建的表中没有主键但是有非空且唯一的字段 那么InnoDB存储引擎会自动(多个非空且唯一的字段会从上到下选第一个)将该字段设置为主键
        	create table t2(
               nid int not null unique,
               sid int not null unique,
               uid int not null unique
        	); 
	3)创建表的时候都应该有一个'id'字段 并且该字段应该作为主键
    		uid、sid、pid、gid、cid、id

"""
额外知识:
id int primary key  单列主键

id int,aid int,primary key(id, aid)  联合主键
"""		
2.auto_increment自增
	(让主键id自己自增 后续只用添加其他字段数据)
	该约束条件不能单独使用'必须跟在键后面'(主要配合主键一起使用)
	
用法:(需先设置主键primary key 然后再跟自增)
		create table t4(
        	id int primary key auto_increment,
        	name varchar(32)
        );
    
 	补充说明:自增的特性:
   		自增的操作不会因为执行'删除单条或所有表数据'的操作而回退或者重置(比如现在主键id有1、2、3、4,如果删除4,再新增一个数据就会从5开始)
        delete from t4 where id=4#删除t4表中id等于4的数据
        这样的好处是:可以一眼看到有没有少数据
        	
		如果非要重置主键 需要格式化表
    	truncate 表名;  # 删除表数据并重置主键值
2.MySQL字段约束条件—外键
*外键前戏:
	需要创建一张员工表
		id	name  gender  dep_name  dep_desc
          1  张三    男      安保部    保护安全
	上述表的缺陷
		1.表结构不清晰 到底是员工表还是部门表(不严重 无所谓)
		2.字段数据反复存取 浪费存储空间(不严重 无所谓)
		3.表的扩展性极差 牵一发动全身(很严重 效率极低)
	优化操作>>>:拆成两个表
		id	  name	  gender
		id	 dep_name	dep_desc
       拆表之后解决了上述的三个问题 但是出现了一个致命的缺陷:两个表之间没有任何关系了
   	解决措施>>>:添加部门编号(外键字段),让两个表有关系
    	id		name	gender 		dep_id
       添加一个部门编号字段来填写部门表的主键
    
——————————————————————————————————————————————————————
1.什么是外键字段:
    专门用于记录表与表之间数据的关系
2.外键字段的创建
	外键字段是用来记录表与表之间数据的关系 而数据的关系有四种
		一对多关系
		多对多关系
		一对一关系
		没有关系
	2.1.表数据关系的判定方法 >>>: '换位思考'
      针对员工表和部门表判断数据关系
		1)先站在员工表的角度
			问:一条员工数据能否对应多条部门数据
			翻:一名员工能否属于多个部门
			答:不可以
		2)再站在部门表的角度
			问:一条部门数据能否对应多条员工数据
			翻:一个部门能否拥有多个员工
			答:可以
          总结:一边可以一边不可以 那么表数据关系就是'一对多'
            	部门是一 员工是多
          #针对一对多:外键字段建在多的一方 
          ps:没有多对一 统一称为'一对多'
3.Foreign Key 外键字段
1.外键字段:
	foreign key(dep_id) references dep1(id)
		关联表中的被关联字段       被关联表(主键)

2.级联更新与级联删除:被关联数据一旦变动 关联的数据同步变动
	级联更新:on update cascade
	级联删除:on delete cascade
'以上三个是一段话 中间不需要加逗号'
1.先创建被关联的表(没有外键字段)
2.再创建关联表(有外键字段)
	2.1.先写普通字段(注意有外键字段的表中只能填写没外键字段表中出现过的数据值)
	2.2.然后再写外键字段,此时被关联字段无法修改和删除。所以还需加级联更新、级联删除。  

create table emp1(
	id int primary key auto_increment,
 	name varchar(32),
  	gender enum('male','female','others') default 'male',
	dep_id int,
	foreign key(dep_id) references dep1(id)#建立外键
	on update cascade  # 级联更新 
	on delete cascade  # 级联删除
);
create table dep1(
	id int primary key auto_increment,
   	dep_name varchar(32),
    dep_desc varchar(32)
);
"""
扩展:
    在实际工作中 很多时候可能并不会使用外键
        因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
    我们为了能够描述出表数据的关系 又不想使用外键
        自己通过写SQL建立代码层面的关系 不用外键 
        
   一般在公司表小于100张时属于较少,可以用外键。超过100则自己写SQL
"""
4.表关系—多对多
以书籍表和作者表为例
	1.先站在书籍表的角度
		问:一条书籍数据能否对应多条作者数据
		答:可以
	2.再站在作者表的角度
		问:一条作者数据能否对应多条书籍数据
		答:可以
	总结:两边都可以 那么表数据关系就是'多对多'
	#针对多对多:外键字段不能建在任意一方!!!
    
	需要单独开设第三张关系表 存储数据关系
    	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  # 级联删除
        );
5.表关系—一对一
以用户表和用户详情表
	1.先站在用户表的角度
		问:一条用户数据能否对应多条用户详情数据
		答:不可以
  	2.再站在用户详情表的角度
		问:一条用户详情数据能否对应多条用户数据
		答:不可以
   总结:两边都不可以 先考虑是不是没有关系
    	如果有关系那就是'一对一'
   针对'一对一'的表关系 外键字段建在任何一张表都可以 但是建议建在查询频率较高的表中便于后续查询
   create table user(
		id int primary key auto_increment,
		name varchar(32)
		detail_id int 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
    );
    
 '一对一 与 一对多 的区别在于一对一被关联字段增加了约束唯一值'

作业

1.整理今日内容及博客
2.熟练掌握课上SQL语句编写
3.判断下列表数据关系 并自定义创建出表
	ps:有些表数据关系不是确定 根据具体业务可能有变化
	服务器表与应用程序表
  	课程表与班级表
	学生表与班级表
	老师表与课程表
	书籍表与出版社表

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/280940.html

(0)
上一篇 2022年8月16日
下一篇 2022年8月16日

相关推荐

发表回复

登录后才能评论