当前位置: 首页 > news >正文

MySQL【表的约束下】

一、自增长

auto_increment自动为数字字段生成唯一值的约束,通常与主键搭配使用,作为逻辑主键(与业务无关的唯一标识),其核心特性为:

  1. 自增长字段必须是索引(key 一栏有值,主键本身是索引,因此可直接搭配);
  2. 自增长字段必须是整数类型
  3. 一张表最多只能有一个自增长字段
  4. 插入数据时不给自增长字段赋值,会自动被系统触发,系统会从当前最大值 + 1 生成新值

案例:

查找建表描述:

我们可以看到,当插入数据时指定id为1000 , 系统的自增值的起始位值会变化:

指定id插入数据到表中,如果合法,会自动插入数据;再次select * from t8 时候,表格以升序把数据整理好 , 但是auto_increment 还是当前表中的最大值 + 1

可以在建表的时候,指定表的自增值,如下:

在插入后获取上一次的AUTO_INCREMENT的值(批量插入获取的是第一个值)

1. 一本书的目录 , 他所存在的价值就是 , 快速查找内容 ;可以目录存在多页,虽然牺牲了很多纸张 , 但是提高了我们查找某一个章节的速度 。

2. 同样的 , 如果数据库的表过于大 , 我们可以再开辟一段空间 , 维护内容 与 数据页码之间的关系

3. 索引它是用空间换取时间

二、唯一键

实际业务中,一张表往往有多个字段需要唯一性约束但主键只能有一个,此时可通过unique key实现,其核心特性为:

  1. 唯一键字段不能重复,但允许为空,且多个空值不做唯一性比较;
  2. 一张表可以有多个唯一键
  3. 主键侧重标识记录的唯一性,唯一键侧重保证业务字段的唯一性
  4. 主键和唯一键是互相补充的。一张表只能有一个主键但可以有多个唯一键。因此,唯一键是对主键的补充,用于约束其他需要唯一性的字段。

我们先来看一下unique :

当插入id值相同的时候 ,unqiue属性约束了插入数据id不可重复,则拒绝插入数据

唯一键的值可以为NULL

为了更加深刻的理解unique这个约束的意义,再来举一个例子:

这个完全就属于数据库设计不好的例子了,在实际的生活中, 不同的人,拿着身份证,申请的号码是唯一的,不重复的唯一键是保证业务字段唯一性的重要手段,它帮助我们将业务规则下沉到数据库层面,让数据存储自身具备校验能力,避免因应用层疏忽导致的数据混乱。在设计表结构时,凡是业务上要求唯一的字段(如手机号、邮箱、身份证号等),都应考虑使用唯一键进行约束。

修正:

主键与唯一键的区别

特性主键(primary key)唯一键(unique key)
唯一性唯一唯一
非空性必须非空允许为空
数量限制一张表一个一张表多个
核心作用标识记录唯一性保证业务字段唯一性

一个保证记录唯一性,一个保证业务逻辑上的唯一性 (主键只能有一个~)

三、外键

谈一个概念:生活中如果有一张表,表中的数据不是孤立的,可能与其他表有关系,我们的MYSQL是关系型数据库,所以表与表之间存在一定的关系 , 所以表与表之间需要存在约束来规范

外键是用于定义主表和从表之间关联关系的约束,能保证从表的数据与主表的一致性,解决数据冗余和数据不一致问题,其核心特性为:

  1. 外键约束定义在从表上,主表必须有主键或唯一键;
  2. 从表的外键字段值必须在主表的主键 / 唯一键中存在,或为 null
  3. 建立外键的本质:将表之间的关联关系交给 MySQL 审核,拒绝插入不符合业务逻辑的数据。

语法:

FOREIGN KEY (从表字段) REFERENCES 主表(主表字段)

案例:

学生表:从表

班级表:主表

  • 外键:需要考虑表与表之间的关联关系
    • 关联
    • 约束

以下两个场景是不符合实际情况的例子:

MYSQL需要在技术层面上,规避这种不合理的情况发生 。 修改从表,设置外键

当试图插入一个不存在的班级编号时,数据库会报错,从而保证了数据的有效性。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

四、综合案例 - 阅读

学习了所有约束后,我们结合商店购物的实际业务场景,设计商品、客户、购买三张表,综合运用上述所有约束,实现数据的完整性和逻辑性保障。

业务需求

  1. 包含商品表、客户表、购买表,表之间通过外键关联;
  2. 每张表设置自增长主键;
  3. 客户姓名不能为空,邮箱和身份证号唯一;
  4. 客户性别仅允许 “男 / 女”;
  5. 商品名、供应商不能为空,单价默认 0;
  6. 购买数量默认 0,关联的客户 ID 和商品 ID 必须存在。
-- 1. 创建数据库,指定字符集 create database if not exists bit32mall default character set utf8 ; -- 2. 选择数据库 use bit32mall; -- 3. 创建商品表(主表) create table if not exists goods ( goods_id int primary key auto_increment comment '商品编号', goods_name varchar(32) not null comment '商品名称', unitprice int not null default 0 comment '单价,单位分', category varchar(12) comment '商品分类', provider varchar(64) not null comment '供应商名称' ); -- 4. 创建客户表(主表) create table if not exists customer ( customer_id int primary key auto_increment comment '客户编号', name varchar(32) not null comment '客户姓名', address varchar(256) comment '客户地址', email varchar(64) unique key comment '电子邮箱,唯一', sex enum('男','女') not null comment '性别,仅允许男/女', card_id char(18) unique key comment '身份证号,唯一' ); -- 5. 创建购买表(从表),外键关联客户表和商品表 create table if not exists purchase ( order_id int primary key auto_increment comment '订单号', customer_id int comment '客户编号', goods_id int comment '商品编号', nums int default 0 comment '购买数量', -- 外键关联客户表 foreign key (customer_id) references customer(customer_id), -- 外键关联商品表 foreign key (goods_id) references goods(goods_id) );

MySQL 的表约束是保障数据质量的核心手段,不同约束各司其职,从基础到核心形成了完整的约束体系:

  1. 基础约束:null/not null(非空)、default(默认值)、comment(注释)、zerofill(零填充),完善字段的基本属性;
  2. 唯一性约束:primary key(主键)、unique key(唯一键)、auto_increment(自增长),保证表内数据的唯一性;
  3. 关联性约束:foreign key(外键),保证表之间数据的一致性,解决数据冗余和脏数据问题。
http://www.jsqmd.com/news/474818/

相关文章:

  • 手把手教你用阿里云镜像制作glibc.i686离线安装包(CentOS7专属)
  • [特殊字符] Nano-Banana实战案例:从手机到家电,全品类产品拆解图生成实录
  • Zotero7文献笔记模版:从安装到自定义的完整指南
  • 喜讯!第十六批生成合成类算法备案备案号公布
  • 天梯赛编程题 L2—048 寻宝图 题解
  • 软件安全实战指南:从零日漏洞到安全部署的核心要义
  • Visual Studio误删.vcxproj.filters文件?3步教你手动重建(附模板)
  • Unity URP渲染管线进阶---自定义RendererFeature实战解析
  • 阿姆智创21.5寸嵌入式工控一体机,多场景智造的嵌入式终端,源头工厂ODM定制应用
  • 衡山派D133EBS开发板驱动MS1100 VOC气体传感器实战指南
  • Linux用户必备:5款免费CAD软件实测对比(附安装指南)
  • OpenMV实战指南:sensor与image模块的高效配置与图像处理技巧
  • 从SCAU综合实验到实战:C语言文件操作与字符处理的进阶解析
  • 避坑指南:PyQt5+Matplotlib动态绘图卡顿?试试这3种优化方案
  • PyTorch量化实战:从模型压缩到移动端部署
  • ENVI遥感图像处理入门实战:从数据加载到基础分析
  • 告别WebSecurityConfigurerAdapter:Spring Security 5.7+组件化配置实战
  • LangGraph实战进阶(二)——巧用条件边与循环构建可自愈的智能体
  • LegionFanControl报错?手把手教你解决TextWriter关闭问题(附Defender白名单设置)
  • 思博伦Spirent TestCenter中高效配置单播流uni-stream的实战指南
  • Ascend平台下的PageAttention优化实践
  • 从颜真卿到赵孟頫:用zi2zi-chain复刻历代书法名家字体的完整流程
  • 基于STM32的多模态智能门禁系统设计与优化
  • 【mmdetection实战】SSD模型适配自定义VOC数据集:从数据准备到模型评估全流程解析
  • OpenSSL交叉编译实战:从配置到优化的完整指南
  • 手把手教你解决uni-app音频播放时长获取问题(附完整代码示例)
  • FAST-LIVO 常见编译与运行时问题全解析
  • SOFTS:如何用“星形聚合”革新多变量时序预测?——NeurIPS 2024核心解读
  • 从表情包到OLED像素:Image2Lcd与PCtoLCD2002双软件取模实战
  • 从STEP到六面体网格:C++集成GMSH实现自动化CAE前处理