
大家好我是你的编程搭子小比特今天这篇博客我把 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数据更可靠示例sqlCREATE TABLE myclass( class_name VARCHAR(20) NOT NULL, class_room VARCHAR(10) NOT NULL );插入时缺了class_room直接报错plaintextERROR 1364 : Field class_room doesnt have a default value三、默认值DEFAULT作用插入数据时不指定该字段自动使用预设值。示例sqlCREATE TABLE tt10 ( name VARCHAR(20) NOT NULL, age TINYINT UNSIGNED DEFAULT 0, sex CHAR(2) DEFAULT 男 );只插 nameage0、sex 男 自动填充sqlINSERT INTO tt10(name) VALUES(zhangsan);四、列描述COMMENT作用给字段加注释说明方便团队维护。示例sqlCREATE TABLE tt12 ( name VARCHAR(20) NOT NULL COMMENT 姓名, age TINYINT UNSIGNED DEFAULT 0 COMMENT 年龄 );查看注释sqlSHOW CREATE TABLE tt12\G五、零填充ZEROFILL作用数字不足指定位数时前面补 0只影响显示不影响存储。示例sqlALTER TABLE tt3 CHANGE a a INT(5) UNSIGNED ZEROFILL;插入1→ 显示00001实际存储还是1。六、主键PRIMARY KEY作用唯一标识一行数据约束最强不能重复不能为空一张表最多一个主键示例sqlCREATE TABLE tt13 ( id INT UNSIGNED PRIMARY KEY COMMENT 学号, name VARCHAR(20) NOT NULL );复合主键多个字段一起做主键组合唯一sqlCREATE TABLE tt14( id INT UNSIGNED, course CHAR(10), PRIMARY KEY(id, course) );追加 / 删除主键sqlALTER TABLE 表 ADD PRIMARY KEY(字段); ALTER TABLE 表 DROP PRIMARY KEY;七、自增长AUTO_INCREMENT作用字段不赋值时自动 1通常配合主键使用。特点必须是索引列必须是整数一张表最多一个自增示例sqlCREATE TABLE tt21( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10) NOT NULL DEFAULT );获取刚插入的自增 IDsqlSELECT LAST_INSERT_ID();八、唯一键UNIQUE KEY作用保证字段业务不重复但允许为 NULL。主键 vs 唯一键主键不能为空一张表一个唯一键可以为空一张表多个示例sqlCREATE TABLE student ( id CHAR(10) UNIQUE COMMENT 学号, name VARCHAR(10) );九、外键FOREIGN KEY作用约束表与表之间的关系保证数据逻辑一致。规则从表外键的值必须在主表主键里存在或为 NULL示例先建主表班级sqlCREATE TABLE myclass ( id INT PRIMARY KEY, name VARCHAR(30) NOT NULL );再建从表学生sqlCREATE TABLE stu ( id INT PRIMARY KEY, name VARCHAR(30) NOT NULL, class_id INT, FOREIGN KEY (class_id) REFERENCES myclass(id) );插入不存在的班级 ID 直接报错保证数据不乱。十、综合实战商城三表设计高频面试题商品表、客户表、订单表一次写完主外键 所有约束sqlCREATE 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 NULLDEFAULTCOMMENTZERO FILLPRIMARY KEYAUTO_INCREMENTUNIQUE KEYFOREIGN KEYname VARCHAR(20)NOT NULLage INTDEFAULT 0id INTPRIMARY KEY AUTO_INCREMENT2. 修改表结构ALTER改表加字段、删字段、改约束、加主键ALTER TABLE 表ADD添加DROP删除MODIFY改类型 / 约束CHANGE改名 改类型ALTER TABLE tADDPRIMARY KEY(id);ALTER TABLE tMODIFYname NOT NULL;3. 修改表中数据改表里的内容增 / 删 / 改记录INSERT插入UPDATE修改DELETE删除INSERT INTO t VALUES (1, 张三 );UPDATE t SET name 李四 WHERE id1;DELETE FROM t WHERE id1;最核心记忆口诀背会永不混约束管字段规则NOT NULL / PRIMARY KEY 等ALTER管表结构加字段、改约束、加主键INSERT / UPDATE / DELETE管表里的数据十三、结束语MySQL 约束看似多其实逻辑非常统一都是为了管住数据不让脏数据进库。开发时先想清楚字段规则再建表后面少填无数坑。如果你觉得这篇博客对你有用欢迎点赞、收藏、关注我会持续更新数据库、C/C、后端开发干货