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(外键),保证表之间数据的一致性,解决数据冗余和脏数据问题。
相关推荐
6+h1 小时前
【MySQL】索引原理详解
数据库·mysql
不羁的fang少年2 小时前
2pc和3pc的比较
数据库
小尔¥2 小时前
LNMP环境部署
运维·数据库·nginx·php
深念Y2 小时前
记一次完整的MongoDB环境配置实录
数据库·mongodb
DBA小马哥2 小时前
国产数据库选型实战:MySQL迁移的兼容性、安全与性能落地
数据库·mysql·安全
Lethehong2 小时前
深入浅出:复杂查询中基于代价的连接条件下推优化实战
数据库
郝学胜-神的一滴2 小时前
深度解析:Python元类手撸ORM框架,解锁底层编程魔法
数据结构·数据库·python·算法·职场和发展
李恒-聆机智能专精数采2 小时前
从零开始了解数据采集技术篇(8)——为什么工业数据采集很难用“一站式平台”解决?从设备生态到系统架构的技术分析
运维·网络·数据库·数据分析·数据采集
小光学长2 小时前
基于ssm的书法学习交流系统25ki07v1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm