MySQL外键彻底入门:是什么、怎么用、什么时候不该用
MySQL外键彻底入门是什么、怎么用、什么时候不该用很多开发同学对 MySQL 外键Foreign Key一直处于似懂非懂的状态知道外键是用来关联两张表但不敢用、不会用、不知道线上能不能开、不知道为什么大厂基本禁用外键。这篇博客用最通俗、实战化的方式从零入门 MySQL 外键不讲废话、只讲开发能用的干货。一、外键到底是干嘛的一句话听懂外键 数据库层面的自动数据关联校验两张表主表父表被关联的表比如用户表、分类表从表子表关联别人的表比如订单表、文章表外键作用保证子表的数据一定在主表存在杜绝脏数据举个例子订单表有个 user_id如果不加外键你可以随便插入一条user_id99999用户根本不存在产生脏数据。如果加了外键数据库直接拦截插不进去、改不了、删不掉。二、外键核心三要素入门必记引擎必须是 InnoDBMyISAM 不支持外键写了也不生效。字段类型必须严格一致主表主键 int子表外键也必须 int长度、符号、是否 unsigned 必须一致否则创建失败。必须建立索引外键字段会自动创建索引不用手动建。三、手把手入门最简单的外键示例先建主表用户表CREATETABLEuser(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(30))ENGINEInnoDB;再建从表订单表绑定外键CREATETABLEorder(idINTPRIMARYKEYAUTO_INCREMENT,user_idINT,priceDECIMAL(10,2),-- 外键关联 user.idFOREIGNKEY(user_id)REFERENCESuser(id))ENGINEInnoDB;生效效果❌ 不能插入不存在的 user_idINSERTINTOorder(user_id,price)VALUES(999,99.9);-- 报错外键约束失败✅ 只能插入真实存在的用户ID这就是外键最核心的价值数据一致性约束四、外键四大联动规则入门重中之重建外键时ON DELETE和ON UPDATE是新手最懵的地方四种规则一次性讲透1. CASCADE 级联更新/删除父表改子表跟着改父表删子表自动删适合订单、子明细数据风险误删主数据子表大批量数据被清空线上高危2. RESTRICT默认/ NO ACTION父表有关联子数据禁止删除/修改最安全、最常用例子用户有订单不让删用户防止数据错乱3. SET NULL删除主表数据子表外键自动置为NULL前提外键字段允许为 NULL适合关联关系可空的业务比如可选分类、可选上级4. SET DEFAULT恢复默认值基本不用、极少场景开发最推荐组合FOREIGNKEY(user_id)REFERENCESuser(id)ONUPDATECASCADEONDELETERESTRICT更新用户ID同步更新有订单不让删用户最符合业务逻辑。五、外键的真实好处为什么学它杜绝脏数据应用层BUG、人为乱改SQL、导入数据都无法产生无效关联数据保证数据一致性多服务、多代码入口操作同一张表时代码层约束会失效数据库约束最稳简化业务代码不用每次新增订单都手动判断用户是否存在数据库自动兜底六、重点为什么国内大厂基本不用外键新手最大疑惑外键这么好用为什么阿里、字节规范禁止使用外键我给你讲最真实的原因不是玄学1. 外键会锁表、锁行高并发性能极差外键校验需要关联查表高并发插入、更新会引发锁等待、死锁压垮数据库。2. 问题排查极难线上报错foreign key constraint fails不看表结构根本不知道哪里冲突排查成本极高。3. 分布式、分库分表完全不支持外键只能单库生效一旦分库分表、微服务拆分外键直接作废。4. 业务灵活性差业务迭代经常需要数据迁移、批量订正、临时删数据外键会卡死所有操作。5. 代码层约束完全可以替代现在项目统一规范逻辑约束放代码数据约束不放数据库七、到底什么时候用什么时候不用✅ 适合用外键的场景小项目、内部系统单体项目、低并发后台管理系统数据质量要求高、不允许脏数据不会分库分表、长期单库运行内部报表、后台系统、OA、CRM❌ 绝对不建议用外键的场景线上互联网项目高并发业务订单、支付、用户微服务、分布式项目未来会分库分表的业务需要频繁批量更新、迁移数据的表八、新手最容易踩的5个外键坑字段类型不一致最常见报错int / unsigned 不匹配直接建表失败MyISAM引擎建外键不报错但完全不生效开启外键后批量删数据报错忘了子表存在线上误开CASCADE删一条主数据连带删除几万条子数据导入数据顺序错误先插子表数据主键不存在报错九、企业替代方案不用外键如何保证一致性大厂不用外键但绝对不是不管数据一致性而是换方案业务层代码判断新增前校验主数据是否存在逻辑删除代替物理删除所有数据只更新delete_flag不真实删除定时任务清洗脏数据定时巡检无效关联数据唯一索引、普通索引兜底结尾外键本身不是垃圾技术它是非常优秀的单库数据一致性方案。它的问题不在于功能而在于不适应高并发、分布式、快速迭代的互联网业务。新手入门记住一句话小系统大胆用外键保数据质量线上高并发、分布式项目坚决不用外键代码层兜底一致性。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →