【Java-MySQL】主键、外键有什么区别?

发布时间:2026/7/17 7:46:38

【Java-MySQL】主键、外键有什么区别? 主键Primary Key和外键Foreign Key的区别是 Java MySQL 开发中最基础也是最重要的数据库概念之一。下面用清晰的表格 详细解释帮助你彻底搞懂1. 一目了然的对比表对比维度主键 (Primary Key)外键 (Foreign Key)作用唯一标识本表的一条记录建立两张表之间的关联关系是否允许为空不允许NOT NULL允许除非你加 NOT NULL是否唯一必须唯一可以重复一个部门可以有多个员工一张表能有几个最多只能有1个复合主键也算一个一张表可以有多个外键是否自动创建索引是主键索引聚簇索引是普通索引非聚簇能否被其他表引用可以被其他表的外键引用不能再被其他表的外键引用除非它同时也是主键对数据的影响插入时必须保证唯一且不为空插入/修改时会检查引用完整性参照完整性约束删除/更新时的行为一般不会删除主键记录或级联删除有4种约束动作RESTRICT / CASCADE / SET NULL / SET DEFAULT2. 详细解释主键 (Primary Key)核心作用唯一标识表中的每一条记录就像人的身份证号。特点不能重复、不能为空。MySQL 中主键会自动创建聚簇索引数据物理存储顺序按主键排序查询速度最快。推荐使用INT/BIGINT AUTO_INCREMENT或UUID视业务而定。示例CREATETABLEusers(idBIGINTPRIMARYKEYAUTO_INCREMENT,-- 主键usernameVARCHAR(50)UNIQUENOTNULL,...);外键 (Foreign Key)核心作用维护两个表之间的参照完整性Referential Integrity。特点外键的值必须来自被引用表的主键或唯一键。防止“孤儿记录”比如删除了一个部门结果还有员工属于这个部门。示例经典部门-员工CREATETABLEdepartments(dept_idINTPRIMARYKEYAUTO_INCREMENT,dept_nameVARCHAR(50)NOTNULL);CREATETABLEemployees(emp_idBIGINTPRIMARYKEYAUTO_INCREMENT,emp_nameVARCHAR(50)NOTNULL,dept_idINT,-- 外键CONSTRAINTfk_emp_deptFOREIGNKEY(dept_id)REFERENCESdepartments(dept_id)ONDELETERESTRICT-- 或 CASCADE / SET NULLONUPDATECASCADE);3. 外键的 4 种约束动作非常重要当你对父表departments进行 DELETE 或 UPDATE 时MySQL 如何处理子表employees动作含义推荐场景RESTRICT/NO ACTION禁止删除/修改默认数据安全要求高CASCADE级联删除/更新父删子也删日志、临时数据SET NULL把子表的外键字段设为 NULL允许员工不属于任何部门SET DEFAULT把子表的外键设为默认值MySQL 不常用-4. Java 开发中实际使用建议强烈推荐使用外键除非性能极致要求防止脏数据代码更清晰JPA/Hibernate 会自动映射关联关系高并发、大数据量场景常见做法开发环境、测试环境保留外键便于发现问题生产环境去掉外键约束只在代码层面Service 层保证完整性 建立普通索引理由外键会导致级联锁表影响并发性能JPA/Hibernate 写法示例EntityTable(nameemployees)publicclassEmployee{IdGeneratedValue(strategyGenerationType.IDENTITY)privateLongid;ManyToOne(fetchFetchType.LAZY)JoinColumn(namedept_id,foreignKeyForeignKey(namefk_emp_dept))privateDepartmentdepartment;}总结一句话记住主键 “我是谁”本表唯一标识外键 “我爸是谁”指向另一个表的标识主键解决本表记录的唯一性外键解决表与表之间的关联完整性。需要我再给你补充复合主键 vs 单列主键物理外键 vs 逻辑外键代码控制性能对比实际项目中如何优雅处理外键随时问我

相关新闻