2026/4/18 17:49:36
网站建设
项目流程
网站制作对公司的作用,网络平台推广广告费用,陕西省建设厅证网站号多少,十大产品设计公司以下是 MySQL 表的约束#xff08;Constraints#xff09; 一文详解#xff0c;适合作为“第六节”的核心内容#xff0c;内容覆盖 MySQL 8.0 主流用法#xff0c;包含原理、语法、常见场景、注意事项和面试/生产高频考点。
一、MySQL 表约束总览#xff08;2025–2026 …以下是MySQL 表的约束Constraints一文详解适合作为“第六节”的核心内容内容覆盖 MySQL 8.0 主流用法包含原理、语法、常见场景、注意事项和面试/生产高频考点。一、MySQL 表约束总览2025–2026 主流约束类型英文名称作用是否允许 NULL是否允许重复是否可以有多列是否可以自定义名称是否可以延迟检查主键约束PRIMARY KEY唯一标识每一行唯一 非空否否可以复合主键可以否唯一约束UNIQUE列/列组合值唯一可以否可以可以否非空约束NOT NULL该列不允许为空否可以—不可否默认值约束DEFAULT未指定值时自动填充默认值———不可否检查约束CHECK自定义条件校验MySQL 8.0.16 真正生效——可以可以否外键约束FOREIGN KEY维护参照完整性可以可以可以可以可以延迟二、每种约束详细语法与实战说明1. 主键约束PRIMARY KEY-- 方式1列级定义最常见CREATETABLEusers(idBIGINTNOTNULLAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULL);-- 方式2表级定义适合复合主键CREATETABLEorder_items(order_idBIGINTNOTNULL,item_idBIGINTNOTNULL,quantityINTNOTNULL,PRIMARYKEY(order_id,item_id));-- 方式3已有表添加主键必须先满足唯一非空ALTERTABLEusersADDPRIMARYKEY(id);重要特性自动创建唯一索引名为PRIMARYInnoDB 表必须有主键推荐自增 BIGINT没有主键的表会隐式创建 6 字节 ROWID 作为聚簇索引不推荐2. 唯一约束UNIQUE-- 列级CREATETABLEemployees(emp_noINTPRIMARYKEY,emailVARCHAR(100)UNIQUENOTNULL);-- 表级复合唯一CREATETABLEuser_roles(user_idBIGINTNOTNULL,role_idBIGINTNOTNULL,UNIQUEKEYuk_user_role(user_id,role_id));-- 已有表添加ALTERTABLEemployeesADDUNIQUEKEYuk_email(email);ALTERTABLEuser_rolesADDUNIQUE(user_id,role_id);关键区别vs 主键项目PRIMARY KEYUNIQUE允许 NULL否是但 NULL 不算重复数量限制一个表只能一个可以多个是否自动创建索引是聚簇索引是普通唯一索引名字固定为 PRIMARY可自定义面试常问一张表可以有多个 UNIQUE 约束但只能有一个 PRIMARY KEY。3. 非空约束NOT NULLCREATETABLEproducts(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULLDEFAULT0.00,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP);注意已有表添加 NOT NULL 时列中不能有 NULL 值否则报错ALTER TABLE ... MODIFY COLUMN可以添加/移除 NOT NULL4. 默认值DEFAULT-- 普通默认值statusTINYINTNOTNULLDEFAULT0,-- 表达式默认值MySQL 8.0.13created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,updated_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,-- 虚拟列默认值函数表达式full_nameVARCHAR(101)GENERATED ALWAYSAS(CONCAT(first_name, ,last_name))STORED,MySQL 8.0 支持的 DEFAULT 表达式CURRENT_TIMESTAMPNOW()UUID()(expression) AS …5. 检查约束CHECK—— MySQL 8.0.16 真正生效CREATETABLEemployees(idINTPRIMARYKEYAUTO_INCREMENT,ageTINYINTUNSIGNEDNOTNULL,salaryDECIMAL(10,2)NOTNULL,-- 方式1列级CHECK(age18ANDage65),-- 方式2表级可跨列CONSTRAINTchk_salaryCHECK(salary3000ANDsalary100000));-- 已有表添加ALTERTABLEemployeesADDCONSTRAINTchk_ageCHECK(ageBETWEEN18AND65);重要提醒MySQL 5.7 及之前版本CHECK 语法可以写但不生效只是语法通过8.0.16 之后才真正校验性能开销较小但复杂 CHECK 会影响写入性能6. 外键约束FOREIGN KEY——参照完整性-- 先创建主表CREATETABLEdepartments(dept_idINTPRIMARYKEYAUTO_INCREMENT,dept_nameVARCHAR(50)NOTNULLUNIQUE);-- 再创建从表CREATETABLEemployees(emp_idINTPRIMARYKEYAUTO_INCREMENT,dept_idINTNOTNULL,nameVARCHAR(50)NOTNULL,FOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)-- 更完整的写法推荐生产环境CONSTRAINTfk_emp_deptFOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)ONDELETERESTRICT-- 默认行为ONUPDATECASCADE);外键动作选项ON DELETE / ON UPDATE选项含义典型使用场景RESTRICT禁止删除/更新主表记录默认严格保护数据完整性CASCADE级联删除/更新主从数据必须保持一致如订单-明细SET NULL主表删除/更新后从表对应字段置 NULL可选关联关系NO ACTION同 RESTRICTMySQL 中等价—外键使用建议生产环境小型项目、性能敏感表 → 可以不建外键用业务代码保证中大型业务系统、数据质量要求高 → 强烈建议建外键 合适的 ON DELETE/UPDATE 策略外键会创建索引如果从表字段没有索引会自动创建三、约束的增删改查操作总结-- 查看表所有约束SHOWCREATETABLEemployees\G-- 查看所有外键SELECT*FROMinformation_schema.REFERENTIAL_CONSTRAINTSWHERETABLE_SCHEMAyour_db;-- 删除约束必须知道约束名ALTERTABLEemployeesDROPFOREIGNKEYfk_emp_dept;ALTERTABLEemployeesDROPPRIMARYKEY;ALTERTABLEemployeesDROPINDEXuk_email;ALTERTABLEemployeesMODIFYCOLUMNemailVARCHAR(100)NULL;-- 移除 NOT NULL-- 添加约束已有数据要满足条件ALTERTABLEemployeesADDUNIQUE(email);ALTERTABLEemployeesADDCONSTRAINTpk_empPRIMARYKEY(emp_id);四、面试/生产高频问题 20 条建议背熟主键和唯一约束的本质区别是什么一张表可以有几个主键几个唯一约束MySQL 外键一定需要创建索引吗ON DELETE CASCADE 和 ON DELETE SET NULL 的适用场景分别是什么MySQL 什么时候真正开始校验 CHECK 约束没有主键的 InnoDB 表底层是怎么存储的复合主键的顺序对查询性能有影响吗外键约束会影响 insert/update/delete 的性能吗如何批量删除外键约束DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 的典型使用场景希望这份总结能帮你彻底搞懂 MySQL 表的约束体系。需要我继续补充外键级联实际案例、CHECK 约束性能测试、无主键表 vs 有主键性能对比等更深入的内容吗