大家好,我是你的编程搭子小比特~今天这篇博客,我把 MySQL 里表的约束从头到尾梳理一遍,全部是面试、开发高频考点,配案例、配语法、配易错点,看完直接能用在项目里。
一、什么是表约束?为什么要用?
数据类型只能做最基础的限制,但业务里要求更严格:比如邮箱不能重复、姓名不能为空、学号必须唯一、成绩不能为负......
约束 = 给字段加 "规则",从业务层面保证数据合法、正确、不混乱。
MySQL 常用约束一共 8 个:NULL / NOT NULL、DEFAULT、COMMENT、ZEROFILL、PRIMARY KEY、AUTO_INCREMENT、UNIQUE KEY、FOREIGN KEY。
二、空属性:NULL / NOT NULL
作用
控制字段是否允许为空。
NULL:允许为空(默认)NOT NULL:不允许为空
关键点
- 空值无法参与运算:
1 + NULL = NULL - 实际开发尽量用
NOT NULL,数据更可靠
示例
sql
CREATE TABLE myclass(
class_name VARCHAR(20) NOT NULL,
class_room VARCHAR(10) NOT NULL
);
插入时缺了 class_room 直接报错:
plaintext
ERROR 1364 : Field 'class_room' doesn't have a default value
三、默认值:DEFAULT
作用
插入数据时不指定该字段,自动使用预设值。
示例
sql
CREATE TABLE tt10 (
name VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED DEFAULT 0,
sex CHAR(2) DEFAULT '男'
);
只插 name,age=0、sex = 男 自动填充:
sql
INSERT INTO tt10(name) VALUES('zhangsan');
四、列描述:COMMENT
作用
给字段加注释说明,方便团队维护。
示例
sql
CREATE TABLE tt12 (
name VARCHAR(20) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄'
);
查看注释
sql
SHOW CREATE TABLE tt12\G
五、零填充:ZEROFILL
作用
数字不足指定位数时,前面补 0,只影响显示,不影响存储。
示例
sql
ALTER TABLE tt3 CHANGE a a INT(5) UNSIGNED ZEROFILL;
插入 1 → 显示 00001,实际存储还是 1。
六、主键:PRIMARY KEY
作用
唯一标识一行数据,约束最强:
- 不能重复
- 不能为空
- 一张表最多一个主键
示例
sql
CREATE TABLE tt13 (
id INT UNSIGNED PRIMARY KEY COMMENT '学号',
name VARCHAR(20) NOT NULL
);
复合主键
多个字段一起做主键,组合唯一:
sql
CREATE TABLE tt14(
id INT UNSIGNED,
course CHAR(10),
PRIMARY KEY(id, course)
);
追加 / 删除主键
sql
ALTER TABLE 表 ADD PRIMARY KEY(字段);
ALTER TABLE 表 DROP PRIMARY KEY;
七、自增长:AUTO_INCREMENT
作用
字段不赋值时自动 + 1,通常配合主键使用。
特点
- 必须是索引列
- 必须是整数
- 一张表最多一个自增
示例
sql
CREATE TABLE tt21(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL DEFAULT ''
);
获取刚插入的自增 ID
sql
SELECT LAST_INSERT_ID();
八、唯一键:UNIQUE KEY
作用
保证字段业务不重复,但允许为 NULL。
主键 vs 唯一键
- 主键:不能为空,一张表一个
- 唯一键:可以为空,一张表多个
示例
sql
CREATE TABLE student (
id CHAR(10) UNIQUE COMMENT '学号',
name VARCHAR(10)
);
九、外键:FOREIGN KEY
作用
约束表与表之间的关系,保证数据逻辑一致。
规则:
- 从表外键的值 必须在主表主键里存在
- 或为 NULL
示例
先建主表(班级):
sql
CREATE TABLE myclass (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
再建从表(学生):
sql
CREATE TABLE stu (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
class_id INT,
FOREIGN KEY (class_id) REFERENCES myclass(id)
);
插入不存在的班级 ID 直接报错,保证数据不乱。
十、综合实战:商城三表设计(高频面试题)
商品表、客户表、订单表,一次写完主外键 + 所有约束:
sql
CREATE DATABASE IF NOT EXISTS mall DEFAULT CHARSET utf8;
USE mall;
-- 商品表
CREATE TABLE goods(
goods_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
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 '客户ID',
name VARCHAR(32) NOT NULL COMMENT '姓名',
address VARCHAR(256) COMMENT '地址',
email VARCHAR(64) UNIQUE COMMENT '邮箱',
sex ENUM('男','女') NOT NULL COMMENT '性别',
card_id CHAR(18) UNIQUE COMMENT '身份证'
);
-- 订单表
CREATE TABLE purchase(
order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
customer_id INT COMMENT '客户ID',
goods_id INT COMMENT '商品ID',
nums INT DEFAULT 0 COMMENT '数量',
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
);
十一、高频考点速记(面试必背)
NOT NULL不能为空,DEFAULT提供默认值COMMENT是注释,ZEROFILL只补 0 不改变存储- 主键唯一且非空,一张表一个
- 自增长必须是整数、索引列
- 唯一键允许 NULL,可建多个
- 外键保证表关系合法,主表必须有主键 / 唯一键
十二、MySQL 约束|表结构修改|数据修改 终极对比表
(一眼不混,直接背)
表格
| 分类 | 作用 | 关键字 / 语句 | 示例 |
|---|---|---|---|
| 1. 字段约束(建表用) | 给字段定规则(不能为空、唯一、默认值等) | NOT NULL DEFAULT COMMENT ZERO FILL PRIMARY KEY AUTO_INCREMENT UNIQUE KEY FOREIGN KEY | name VARCHAR(20) NOT NULL age INT DEFAULT 0 id INT PRIMARY KEY AUTO_INCREMENT |
| 2. 修改表结构(ALTER) | 改表:加字段、删字段、改约束、加主键 | ALTER TABLE 表 ADD (添加)DROP (删除)MODIFY (改类型 / 约束)CHANGE(改名 + 改类型) | ALTER TABLE t ADD PRIMARY KEY(id);ALTER TABLE t MODIFY name NOT NULL; |
| 3. 修改表中数据 | 改表里的内容:增 / 删 / 改记录 | INSERT (插入)UPDATE (修改)DELETE(删除) | INSERT INTO t VALUES (1,' 张三 ');UPDATE t SET name=' 李四 ' WHERE id=1;DELETE FROM t WHERE id=1; |
最核心记忆口诀(背会永不混)
- 约束:管字段规则(NOT NULL / PRIMARY KEY 等)
- ALTER:管表结构(加字段、改约束、加主键)
- INSERT / UPDATE / DELETE:管表里的数据
十三、结束语
MySQL 约束看似多,其实逻辑非常统一:都是为了管住数据,不让脏数据进库。开发时先想清楚字段规则,再建表,后面少填无数坑。
如果你觉得这篇博客对你有用,欢迎 点赞、收藏、关注,我会持续更新数据库、C/C++、后端开发干货~