当前位置: 首页 > news >正文

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

主键(Primary Key)和外键(Foreign Key)的区别是 Java + MySQL 开发中最基础也是最重要的数据库概念之一。下面用清晰的表格 + 详细解释,帮助你彻底搞懂:

1. 一目了然的对比表

对比维度主键 (Primary Key)外键 (Foreign Key)
作用唯一标识本表的一条记录建立两张表之间的关联关系
是否允许为空不允许(NOT NULL)允许(除非你加 NOT NULL)
是否唯一必须唯一可以重复(一个部门可以有多个员工)
一张表能有几个最多只能有1个(复合主键也算一个)一张表可以有多个外键
是否自动创建索引是(主键索引,聚簇索引)是(普通索引,非聚簇)
能否被其他表引用可以(被其他表的外键引用)不能再被其他表的外键引用(除非它同时也是主键)
对数据的影响插入时必须保证唯一且不为空插入/修改时会检查引用完整性(参照完整性约束)
删除/更新时的行为一般不会删除主键记录(或级联删除)有4种约束动作:RESTRICT / CASCADE / SET NULL / SET DEFAULT

2. 详细解释

主键 (Primary Key)
  • 核心作用唯一标识表中的每一条记录(就像人的身份证号)。
  • 特点:
    • 不能重复、不能为空。
    • MySQL 中主键会自动创建聚簇索引(数据物理存储顺序按主键排序),查询速度最快。
    • 推荐使用:INT/BIGINT AUTO_INCREMENTUUID(视业务而定)。
  • 示例:
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 开发中实际使用建议

  1. 强烈推荐使用外键(除非性能极致要求):

    • 防止脏数据
    • 代码更清晰(JPA/Hibernate 会自动映射关联关系)
  2. 高并发、大数据量场景常见做法:

    • 开发环境、测试环境:保留外键(便于发现问题)
    • 生产环境:去掉外键约束,只在代码层面(Service 层)保证完整性 + 建立普通索引
    • 理由:外键会导致级联锁表,影响并发性能
  3. JPA/Hibernate 写法示例

@Entity@Table(name="employees")publicclassEmployee{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;@ManyToOne(fetch=FetchType.LAZY)@JoinColumn(name="dept_id",foreignKey=@ForeignKey(name="fk_emp_dept"))privateDepartmentdepartment;}

总结(一句话记住):

  • 主键= “我是谁”(本表唯一标识)
  • 外键= “我爸是谁”(指向另一个表的标识)

主键解决本表记录的唯一性,外键解决表与表之间的关联完整性


需要我再给你补充:

  • 复合主键 vs 单列主键?
  • 物理外键 vs 逻辑外键(代码控制)性能对比?
  • 实际项目中如何优雅处理外键?

随时问我!

http://www.cnnetsun.cn/news/1327608.html

相关文章:

  • 探索 COMSOL 顺层钻孔瓦斯抽采:双孔隙介质数值模拟模型
  • Power of Four二进制特性--力扣101算法题解笔记
  • 别再瞎找了!10个降AIGC平台全行业通用测评与推荐
  • 登录微信可以但无法访问浏览器
  • 专业的负氧离子座舱公司
  • 商标注册通关指南:从命名到审核的实战策略
  • 基于阶梯式碳机制与电制氢的综合能源系统热电优化调度策略:降低成本、减少排放与提升氢能效益
  • nginx安全防护与HTTPS部署实战
  • CISP是什么证书?CISP报考指南(非常详细)零基础入门到精通,收藏这篇就够了
  • 【Iced】core库Vector 结构体源码解析(vector.rs)
  • 如何安装安卓Android Studio
  • 高斯分布意义及其表达式、方差和协方差
  • 探索考虑泊位优化与多能协同的港口综合能源系统运行优化
  • 剪映专业版教程:制作连续翻页相册效果
  • 1959. 【普及组模拟1】愤怒的牛(aggr.pas/c/cpp)
  • 全面盘点!2026年高口碑国产信创动环监控系统推荐榜单,助力打造智能化工厂安全管理新模式
  • 企业用智能体要投入多少成本?2026避坑指南与主流产品横评
  • 论语第十二篇-颜渊
  • AI获客必须知道这3家专业公司,千万别选错!
  • 千万注意!这家诚信轨道灯厂家,竟让客户排队抢购!
  • NJR-10线材扭转卷绕试验机
  • 十年网安老兵血泪教训:这行“一般人”慎入,三大扎心现实与一条窄路
  • redis缓存穿透、击穿、雪崩的区别
  • Spring面试必问核心知识点精讲
  • C++入门:从基础语法到核心实战
  • Spring AI重塑Java生态,企业级AI开发新纪元
  • KVM Web管理界面安装指南(Cockpit 方案)
  • RDP内核驱动:TdInputThread与IcaChannelInput解析
  • 2025大陆护照+港卡注册Stripe全攻略
  • 书匠策AI vs 传统问卷设计:一场科研效率与创意的革命性碰撞