【MYSQL】MYSQL学习的一大重点:表的约束

🎬 个人主页艾莉丝努力练剑
专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:


文章目录

  • 前言
  • [1 ~> 空约束(NULL / NOT NULL)](#1 ~> 空约束(NULL / NOT NULL))
  • [2 ~> 默认值(DEFAULT)](#2 ~> 默认值(DEFAULT))
  • [3 ~> 列描述(COMMENT)](#3 ~> 列描述(COMMENT))
  • [4 ~> ZEROFILL](#4 ~> ZEROFILL)
  • [5 ~> 主键(PRIMARY KEY)](#5 ~> 主键(PRIMARY KEY))
    • [5.1 主键的概念和示例](#5.1 主键的概念和示例)
    • [5.2 复合主键](#5.2 复合主键)
    • [5.3 追加主键](#5.3 追加主键)
    • [5.4 删除主键](#5.4 删除主键)
  • [6 ~> 自增长(AUTO_INCREMENT)](#6 ~> 自增长(AUTO_INCREMENT))
    • [6.1 自增长的概念和示例](#6.1 自增长的概念和示例)
    • [6.2 获取上次插入的自增值](#6.2 获取上次插入的自增值)
  • [7 ~> 唯一键(UNIQUE KEY)](#7 ~> 唯一键(UNIQUE KEY))
  • [8 ~> 外键(FOREIGN KEY)](#8 ~> 外键(FOREIGN KEY))
  • [9 ~> 综合案例](#9 ~> 综合案例)
    • [9.1 表结构](#9.1 表结构)
    • [9.2 SQL 示例(节选)](#9.2 SQL 示例(节选))
  • 结尾


前言

  • 约束用于保证数据的合法性和业务逻辑的正确性,补充数据类型本身的限制。

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。

表的约束很多,这里主要介绍如下几个:null / not nulldefaultcommentzerofillprimary keyauto_incrementunique key


1 ~> 空约束(NULL / NOT NULL)

  • NULL:默认值,字段可以为空。

  • NOT NULL:字段不能为空,防止数据缺失影响运算。

示例:

sql 复制代码
create table myclass (
    class_name varchar(20) not null,
    class_room varchar(10) not null
);

2 ~> 默认值(DEFAULT)

为字段指定默认值,插入数据时若未提供该字段值,则使用默认值。

示例:

sql 复制代码
create table tt10 (
    name varchar(20) not null,
    age tinyint unsigned default 0,
    sex char(2) default '男'
);

3 ~> 列描述(COMMENT)

用于描述字段含义,供程序员或DBA参考,无实际约束作用。

示例:

sql 复制代码
create table tt12 (
    name varchar(20) not null comment '姓名',
    age tinyint unsigned default 0 comment '年龄',
    sex char(2) default '男' comment '性别'
);

查看注释:

sql 复制代码
show create table tt12;

4 ~> ZEROFILL

用于数字类型,显示时在左侧补零,宽度由括号中的数字决定。

不加 zerofill 时,括号内数字无实际意义。

示例:

sql 复制代码
alter table tt3 modify a int(5) zerofill;

5 ~> 主键(PRIMARY KEY)

5.1 主键的概念和示例

唯一标识一条记录,不允许重复,不允许为空。

支持单列主键和复合主键。

示例:

sql 复制代码
create table tt13 (
    id int unsigned primary key,
    name varchar(20) not null
);

5.2 复合主键

sql 复制代码
create table tt14 (
    id int unsigned,
    course char(10),
    score tinyint unsigned default 60,
    primary key(id, course)
);

5.3 追加主键

sql 复制代码
alter table 表名 add primary key(字段列表);

5.4 删除主键

sql 复制代码
alter table 表名 drop primary key;

6 ~> 自增长(AUTO_INCREMENT)

6.1 自增长的概念和示例

自动为字段生成唯一递增的值,通常与主键搭配使用。

要求:

  • 字段必须是整数类型

  • 必须是索引(如主键)

  • 一张表最多一个自增长字段

示例:

sql 复制代码
create table tt21 (
    id int unsigned primary key auto_increment,
    name varchar(10) not null default ''
);

6.2 获取上次插入的自增值

sql 复制代码
select last_insert_id();

7 ~> 唯一键(UNIQUE KEY)

保证字段值唯一,但允许为NULL,且多个NULL不视为重复。

用于补充主键,满足多个字段的唯一性需求。

示例:

sql 复制代码
create table student (
    id char(10) unique comment '学号,不能重复,但可以为空',
    name varchar(10)
);

8 ~> 外键(FOREIGN KEY)

建立主表与从表之间的关联,确保数据一致性。

外键字段的值必须在主表的主键或唯一键中存在,或为 NULL。

示例:

sql 复制代码
create table stu (
    id int primary key,
    name varchar(30) not null,
    class_id int,
    foreign key (class_id) references myclass(id)
);

9 ~> 综合案例

一个包含商品、客户、购买记录的数据库设计,展示了多种约束的综合使用。

9.1 表结构

商品表(goods)

  • 主键:goods_id

  • 约束:goods_name 非空,unitprice 默认 0

客户表(customer)

  • 主键:customer_id

  • 约束:name 非空,email 唯一,sex 枚举类型,card_id 唯一

购买表(purchase)

  • 主键:order_id

  • 外键:customer_id 引用 customer(customer_id)

  • 外键:goods_id 引用 goods(goods_id)

9.2 SQL 示例(节选)

sql 复制代码
create table 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 '供应商名称'
);

create table 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 '身份证'
);

create table 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)
);

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

结语:希望对学习MYSQL相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!

往期回顾

【MYSQL】MYSQL学习的一大重点:MYSQL数据类型

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
2301_803875614 小时前
PHP 中处理会话数组时的类型错误解析与修复指南
jvm·数据库·python
m0_743623924 小时前
c++如何批量修改文件后缀名_std--filesystem--replace_extension【实战】
jvm·数据库·python
MY_TEUCK4 小时前
Sealos 平台部署实战指南:结合 Cursor 与版本发布流程
java·人工智能·学习·aigc
2401_873479405 小时前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
桌面运维家5 小时前
IDV云桌面vDisk机房网络管控访问限制部署方案
运维·服务器·网络
我爱cope5 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
ShineWinsu5 小时前
对于Linux:动静态库的制作与原理的解析—下
linux·运维·服务器·进程·链接·虚拟地址空间·
2501_914245935 小时前
CSS如何处理CSS变量作用域冲突_利用特定类名重写变量值
jvm·数据库·python
菜鸟学Python5 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
RH2312116 小时前
2026.4.16Linux 管道
java·linux·服务器