【百日精通JAVA | SQL篇 | 第四篇】约束

SQL这一块没什么难度,主要是一个熟练度,稍微上点难度的地方,其实在于查,比较复杂,涉及到很多问题。

指定列插入

使用指定列插入的时候,未被指定的列使用默认值进行存储,默认值为空。

默认值设置

default关键字,在设置字段时,可以对其默认值进行修改

Primary Key 主键

主键约束,主键就是一条数据-身份标识

通过这个约束,来指定某个列作为主键

1)非空

2)不能重复

一个表,只能有一个主键,但是一个主键可以对应多个列,我们称之为联合主键。

Primary Key auto_increment 自增主键

主键,往往是一个整数类型的id,要求不能重复。允许客户端,在插入数据时候,不手动指定主键的值,而是交给MYSQL自行分配,确保分配出来的这个主键的值,是和之前不重复的。

primary key auto_increment 自增主键 意味着数据库自行分配一个键值.

那如果再次插入数据的时候,id自动分配的是4还是11?

数据库记录了,当前表中id最大值,此时id自动分配的是11.

前面的4 5 6 7... 浪费了也无所谓,空间非常大,即便我们浪费几千、几万个也无所谓

一共可以表示几十亿个数据。

mysql服务器会维护这样的最大值

如果mysql是一个单个节点的系统,按照上述自增主键的策略,是没问题的

如果mysql是一个分布式系统,搞了好几个主机,每个主机都有mysql,让他们相互配合,此时,自增主键,就无法保证唯一性了。

注意:每个主机存储时都只会存储最大数值的id,那么此时就会出现重复

FOREIGN KEY: 外键约束

当前这个表的哪一类要受到约束

在这个代码中,需要明确交代,哪个表的那一列要受到哪一个表的那一列的约束

sql 复制代码
create table student(
studentId int primary key auto_increment,
name varchar(20),
classId int,
foreign key (classId) references class(classId));

插入或者修改子表受约束的这一列数据,就需要保证插入/修改后的结果,得在父表中存在!!

删除/修改 父表中的记录,就需要看看这个记录是否在子表中被使用了,如果被使用了,则不能进行修改或者删除。约束是双向的

索引

设置外键的时候,就会导致在操作子表的时候,频繁访问父表

这一个查询操作,是很耗时间的,为了加快查询速度,如果父表的ID这一列带有索引的话,就很好了

索引:相当于页码,我们提前知道这个id在书上第几页,直接翻到即可,primary key和unique都带有索引,自动创建索引,因此没有索引无法创建外键

相关推荐
Shawn_Shawn2 小时前
mcp学习笔记(一)-mcp核心概念梳理
人工智能·llm·mcp
invicinble4 小时前
对linux形成认识
linux·运维·服务器
马克Markorg4 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
冷雨夜中漫步4 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
技术路上的探险家4 小时前
8 卡 V100 服务器:基于 vLLM 的 Qwen 大模型高效部署实战
运维·服务器·语言模型
33三 三like4 小时前
《基于知识图谱和智能推荐的养老志愿服务系统》开发日志
人工智能·知识图谱
芝士爱知识a4 小时前
【工具推荐】2026公考App横向评测:粉笔、华图与智蛙面试App功能对比
人工智能·软件推荐·ai教育·结构化面试·公考app·智蛙面试app·公考上岸
半桔4 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
绵绵细雨中的乡音4 小时前
深入理解 ET 与 LT 模式及其在 Reactor 模型中的应用
服务器·网络·php
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring