今日内容回顾
约束条件
-
primary key主键
-
单从约束角度上而言主键等价于非空且唯一 (not null unique)
代码层面
create table t1( id int primary key,# >>>:等同于在此处写了 not null,unique name varchar(32)); """ 在创建表阶段字段后面加上了primary key 那么在插入记录阶段,插入的数据就不能又相同的数据或者不插入该字段的数据。 在约束层面就等于你在上面写了 not null unique """
-
其中InnoDB存储引擎规定一张表,必须存在且只有一个主键。
如果创建的表中没有主键也没有非空且唯一的字段,那么InnoDB存储引擎
会自动采用一个隐藏的字段作为主键(主键可以加快数据查询效率)
如果创建的表中没有主键但是又非空且唯一的字段,那么InnoDB存储引擎
会自动将改字段设置为主键。
如下:
create table t1( nid int not null unique, uid int not null unique, sid int not null unique, name varchar(32)); """ 如果多个字段中都有非空且唯一,没有主键 引擎会自动从上往下搜索找到第一个有非空且唯一的字段 会自动将第一个找到拥有非空且唯一的字段升级为主键。 """
创建表的时候都应该有一个id字段,并且该id字段应作为主键。
列如:uid、sid、pid、gid、cid、id
补充说明:
id int primary key 可以称为单列主键
sid int,
nid int,
primary key(sid,nid) 可以称为联合主键
-
auto_increment自增
该约束条件不能单独使用,必须跟在键后面(主要配合主键一起使用)
# 错误方式 create table t3( id int auto_increment ) """ Incorrect table definition; there can be only one auto column and it must be defined as a key 单独使用会直接报错!!! """ # 错误正确 create table t1(id int primary key auto_increment, name varchar(32)); """ 自增的特点 auto_increment结合primary key使用后在插入数据就不需要在做插入id字段的操作 也就是主键字段就不需要管理系统会自动添加,并且跟随其它字段中新的数据插入而自增。 但是自增的操作不会因为执行删除数据的操作而回退或者重置 如果非要重置那么需要格式化表才能重置。 truncate 表名; 删除表数据并且重置主键 """
-
约束条件之外键
-
外键前戏
-
需要创建一张员工表
id name gender dep_name dep_desc 1 jason male 讲师部 教书育人 2 lili female 财务部 管理公司资金 3 kevin male 安保部 维护治安 4 tom male 讲师部 教书育人 -
上述表的缺陷
表结构不清晰,分不清到底算员工表还是部门表
字段数据反复存取,浪费存储空间
表的扩展性极差,修改数据太繁琐。
-
优化操作>>>: 拆分成俩个表
表1:员工表
id name gender 1 jason male 2 lili female 3 kevin male 4 tom male 表2:部门表
id dep_name dep_desc 1 讲师部 教书育人 2 财务部 管理公司资金 3 安保部 维护治安 拆表之后解决了上述的三个问题,但是出现了一个问题分不清那个员工是那个部门的了
-
解决措施
id name gender dep_id
在表1里添加(dep_id)
添加一个部门编号字段填写部门数据的主键值,
外键字段,用于记录表与表之间的关系。
-
-
外键字段的创建
外键字段是用于记录表与表之间数据的关系,而数据的关系分有四种
一对多关系、多对多关系、一对一关系、没有关系。
-
表数据关系的判断>>>: 换位思考
列如:针对员工表和部门表判断数据关系
先站在员工表的角度上考虑,一个员工能否属于多个部门>>>:不可以
再站在部门的角度上思考,一个部门能否拥有多个员工>>>:可以
-
完成换位思考后得出结果,一个可以一个不可以
那么表的关系就是一对多关系,部门是一 员工是多
针对一对多的关系,外键字段需要建在多的一方。
-
关系表之间的简易判断
一对多关系表判定:俩边又一边对应对方多条数据,那么表数据关系就是一对多表关系。
多对多关系表判定:俩边都可以对应对方的多条数据,那么表数据关系就是多对多表关系。
一对一关系表判定:俩张表之间数据都不能对应对方的数据,先考虑是不是没有关系,没有关系就不需要建立对应关系。如果有关系那么肯定就是一对一关系
-
foreign key外键
创建表的时候需要先创建被关联的表(没有外键的表),然后再创建关联表(有外键的表)
一对多关系表创建
如下:
-
先创建部门表(没有外键foreign key的表、被关联的表)
如下:
-
再创建员工表(有外键foreign key的表。)
如下:
-
插入表数据的时候针对外键字段只能填写被关联表字段已经存在的数据值
被关联字段无法修改和删除,限制性太强。
加入联及更新(on update cascade)、联及删除(on delete cascade)
被关联数据一旦变动,关联数据同步变动。
如下:
-
扩展
在实际工作中,很多时候可能并不会使用到外键。
因为外键增加了表之间的耦合度,不便于单独操作并且消耗资源增加
为了能够描述出表数据的关系,又不像使用外键,可以通过写SQL建立代码层面的关系。
表关系之多对多
俩边都可以对应对方的多条数据,那么表数据关系就是多对多表关系。
针对一对多关系表的创建,外键需要写在关联表的一方。那么多对多表关系的话
外键字段不能建在任意一方需要单独开设第三张关系表建在第三方表中,存储数据关系。
如下:
表关系之一对一
俩张表之间数据都不能对应对方的多条数据,先考虑是不是没有关系,没有关系就不需要建立对应关系。
如果有关系那么肯定就是一对一关系。
针对一对一的表关系,外键字段建在那一方都可以,但是建议建在查询频率较高的表中方便于后续查询,并且还需要在改表中设定的关联对方id字段中添加且唯一约束条件 unique。
如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)