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

主键 外键

主键 外键

在这里插入图片描述

在关系型数据库中,主键(Primary Key)和外键(Foreign Key)是用于维护数据完整性和建立表之间关系的重要概念。

主键(Primary Key)

  • 定义: 主键是一个或多个列的组合,其值能够唯一标识表中的每一行。
  • 特性:
    • 唯一性: 主键的值必须是唯一的,不能重复。
    • 非空性: 主键列不能包含 NULL 值。
    • 单一性: 每个表只能有一个主键。
  • 用途: 主键用于确保每一行数据的唯一性,并作为其他表引用的基础。
示例

假设有一个 users 表:

CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50),email VARCHAR(100)
);

在这个例子中,user_id 是主键,它唯一标识每个用户。

外键(Foreign Key)

  • 定义: 外键是一个或多个列的组合,其值引用另一个表中的主键。
  • 特性:
    • 引用完整性: 外键值必须在被引用的表中存在(或为 NULL)。
    • 多对一关系: 外键通常用于建立表之间的多对一关系。
  • 用途: 外键用于维护表之间的关系和引用完整性。
示例

假设有一个 orders 表,其中 user_id 是外键,引用 users 表的主键:

CREATE TABLE orders (order_id INT PRIMARY KEY,order_date DATE,user_id INT,FOREIGN KEY (user_id) REFERENCES users(user_id)
);

在这个例子中,user_id 是外键,它引用 users 表中的 user_id 主键。这确保了每个订单都与一个有效的用户相关联。

主键和外键的关系

  • 主键: 定义在一个表中,用于唯一标识该表中的记录。
  • 外键: 定义在一个表中,用于引用另一个表的主键,从而建立两个表之间的关系。

维护数据完整性

  • 级联操作: 可以设置外键约束的级联操作,如 ON DELETE CASCADE,以便在删除或更新主表记录时自动更新或删除相关的外键记录。
  • 约束检查: 数据库在插入或更新数据时会检查外键约束,以确保引用完整性。( 此时, 不使用 ON DELETE CASCADE 亦同 )

通过使用主键和外键,你可以确保数据库中的数据完整性,并建立表之间的关系,从而更好地组织和管理数据。

主键 外键 mybatis

在使用 MyBatis 进行数据库操作时,主键和外键的概念依然适用,因为它们是数据库层面的约束和关系。MyBatis 是一个持久层框架,它通过 XML 或注解的方式将 SQL 语句与 Java 对象进行映射。以下是如何在 MyBatis 中处理主键和外键的基本方法:

主键处理

  1. 自动生成主键

    在数据库中,主键通常是自动生成的(例如,自增 ID)。在 MyBatis 中,可以使用 useGeneratedKeyskeyProperty 来获取自动生成的主键值。

    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="userId">INSERT INTO users (username, email) VALUES (#{username}, #{email})
    </insert>
    
    • useGeneratedKeys="true": 告诉 MyBatis 使用数据库生成的主键。
    • keyProperty="userId": 指定实体类中用于存储生成主键的属性。
  2. 手动设置主键

    如果主键不是自动生成的,你需要在插入数据时手动设置主键值。

    <insert id="insertUser" parameterType="User">INSERT INTO users (user_id, username, email) VALUES (#{userId}, #{username}, #{email})
    </insert>
    

外键处理

外键关系通常在数据库设计时定义。在 MyBatis 中,处理外键关系主要涉及到如何查询和映射相关联的数据。

  1. 一对多关系

    假设一个用户可以有多个订单,你可以在 MyBatis 中定义一个查询来获取用户及其订单列表。

    <select id="selectUserWithOrders" resultMap="UserOrderMap">SELECT u.user_id, u.username, o.order_id, o.order_dateFROM users uLEFT JOIN orders o ON u.user_id = o.user_idWHERE u.user_id = #{userId}
    </select><resultMap id="UserOrderMap" type="User"><id property="userId" column="user_id"/><result property="username" column="username"/><collection property="orders" ofType="Order"><id property="orderId" column="order_id"/><result property="orderDate" column="order_date"/></collection>
    </resultMap>
    
    • resultMap: 定义如何将查询结果映射到 Java 对象。
    • collection: 用于映射一对多关系,将多个订单映射到一个用户对象的 orders 属性。
  2. 多对一关系

    如果一个订单属于一个用户,你可以在订单查询中包含用户信息。

    <select id="selectOrderWithUser" resultMap="OrderUserMap">SELECT o.order_id, o.order_date, u.user_id, u.usernameFROM orders oJOIN users u ON o.user_id = u.user_idWHERE o.order_id = #{orderId}
    </select><resultMap id="OrderUserMap" type="Order"><id property="orderId" column="order_id"/><result property="orderDate" column="order_date"/><association property="user" javaType="User"><id property="userId" column="user_id"/><result property="username" column="username"/></association>
    </resultMap>
    
    • association: 用于映射多对一关系,将用户信息映射到订单对象的 user 属性。

总结

  • 主键: 在 MyBatis 中,可以通过 useGeneratedKeyskeyProperty 来处理自动生成的主键。
  • 外键: 通过 resultMapcollectionassociation 来处理表之间的关系和数据映射。

通过这些配置,你可以在 MyBatis 中有效地处理主键和外键关系,确保数据的完整性和一致性。

主键 外键 hibernate

在 Hibernate 中,主键和外键的概念同样适用,因为它们是关系型数据库的基本组成部分。Hibernate 是一个对象关系映射(ORM)框架,它将 Java 对象映射到数据库表中。以下是如何在 Hibernate 中处理主键和外键的基本方法:

主键处理

  1. 简单主键

    在 Hibernate 中,简单主键通常使用 @Id 注解来标识。可以结合 @GeneratedValue 注解来自动生成主键值。

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;@Entity
    public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long userId;private String username;private String email;// Getters and setters
    }
    
    • @Id: 标识主键字段。
    • @GeneratedValue: 指定主键生成策略。GenerationType.IDENTITY 通常用于自增主键。
  2. 复合主键

    对于复合主键,可以使用 @EmbeddedId@IdClass 注解。

    import javax.persistence.Embeddable;
    import java.io.Serializable;@Embeddable
    public class OrderId implements Serializable {private Long orderId;private Long userId;// Getters, setters, equals, and hashCode
    }import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;@Entity
    public class Order {@EmbeddedIdprivate OrderId id;private String orderDate;// Getters and setters
    }
    
    • @Embeddable: 用于定义复合主键类。
    • @EmbeddedId: 用于在实体中嵌入复合主键。

外键处理

外键用于定义实体之间的关系。在 Hibernate 中,使用 @ManyToOne, @OneToMany, @OneToOne, 和 @ManyToMany 注解来定义这些关系。

  1. 多对一关系

    在订单和用户之间的多对一关系中,订单表中的 userId 是外键。

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.ManyToOne;@Entity
    public class Order {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long orderId;private String orderDate;@ManyToOneprivate User user;// Getters and setters
    }
    
    • @ManyToOne: 定义多对一关系,通常在外键字段上使用。
  2. 一对多关系

    在用户和订单之间的一对多关系中,用户表中的 userId 是主键,订单表中的 userId 是外键。

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import java.util.List;@Entity
    public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long userId;private String username;private String email;@OneToMany(mappedBy = "user")private List<Order> orders;// Getters and setters
    }
    
    • @OneToMany: 定义一对多关系,mappedBy 属性指定关系的拥有方。
  3. 一对一关系

    使用 @OneToOne 注解来定义一对一关系。

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;@Entity
    public class UserProfile {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long profileId;private String address;@OneToOneprivate User user;// Getters and setters
    }
    
    • @OneToOne: 定义一对一关系。

总结

  • 主键: 使用 @Id@GeneratedValue 来定义和生成主键。
  • 外键: 使用关系注解(如 @ManyToOne, @OneToMany)来定义实体之间的关系。

通过这些注解和配置,你可以在 Hibernate 中有效地处理主键和外键关系,确保数据的完整性和一致性。

主键 外键 mybatis plus

MyBatis-Plus 是 MyBatis 的增强版,提供了许多便捷的功能来简化开发过程。在 MyBatis-Plus 中,主键和外键的处理与 MyBatis 类似,但它提供了一些额外的工具和注解来简化这些操作。

主键处理

  1. 自动生成主键

    MyBatis-Plus 支持自动生成主键,通常通过数据库的自增字段实现。你可以使用 @TableId 注解来指定主键字段,并设置主键生成策略。

    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;@TableName("users")
    public class User {@TableId(value = "user_id", type = IdType.AUTO)private Long userId;private String username;private String email;// Getters and setters
    }
    
    • @TableId: 用于标识主键字段。
    • IdType.AUTO: 指定主键生成策略为自增。
  2. 手动设置主键

    如果主键不是自动生成的,你可以在插入数据时手动设置主键值。

    @TableId(value = "user_id", type = IdType.INPUT)
    private Long userId;
    
    • IdType.INPUT: 指定主键由用户输入。

外键处理

外键关系通常在数据库设计时定义。在 MyBatis-Plus 中,处理外键关系主要涉及到如何查询和映射相关联的数据。MyBatis-Plus 本身不直接处理外键关系,但你可以通过编写 SQL 查询和使用关联查询来实现。

  1. 一对多关系

    假设一个用户可以有多个订单,你可以在 MyBatis-Plus 中定义一个查询来获取用户及其订单列表。

    @TableName("orders")
    public class Order {@TableId(value = "order_id", type = IdType.AUTO)private Long orderId;private String orderDate;private Long userId;// Getters and setters
    }
    

    你可以使用自定义 SQL 查询来获取用户及其订单:

    @Select("SELECT u.user_id, u.username, o.order_id, o.order_date FROM users u LEFT JOIN orders o ON u.user_id = o.user_id WHERE u.user_id = #{userId}")
    List<UserWithOrders> selectUserWithOrders(@Param("userId") Long userId);
    
  2. 多对一关系

    如果一个订单属于一个用户,你可以在订单查询中包含用户信息。

    @Select("SELECT o.order_id, o.order_date, u.user_id, u.username FROM orders o JOIN users u ON o.user_id = u.user_id WHERE o.order_id = #{orderId}")
    OrderWithUser selectOrderWithUser(@Param("orderId") Long orderId);
    

总结

  • 主键: 使用 @TableId 注解来定义主键字段,并指定主键生成策略。
  • 外键: 通过自定义 SQL 查询和关联查询来处理表之间的关系。

MyBatis-Plus 提供了许多便捷的功能来简化数据库操作,但对于复杂的外键关系,仍然需要通过 SQL 查询来实现。通过这些配置和查询,你可以在 MyBatis-Plus 中有效地处理主键和外键关系,确保数据的完整性和一致性。

相关文章:

主键 外键

主键 外键 在关系型数据库中&#xff0c;主键&#xff08;Primary Key&#xff09;和外键&#xff08;Foreign Key&#xff09;是用于维护数据完整性和建立表之间关系的重要概念。 主键&#xff08;Primary Key&#xff09; 定义: 主键是一个或多个列的组合&#xff0c;其值能…...

G - Road Blocked 2

G - Road Blocked 2 思路 只有当一条边是从 1 1 1到 n n n的所有最短路构成的图的桥时&#xff0c;去掉这条边&#xff0c;最短路才会变大 所以就可以用最短路加tarjan解决这道题了 怎么判断一条边是否可以构成最短路呢&#xff0c;比如求 1 1 1到 n n n的最短路&#xff0…...

R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)

Venn图&#xff0c;又称文氏图&#xff0c;标题中其他名字也是它的别称&#xff0c;由封闭圆形组成&#xff0c;代表不同集合。圆形重叠部分表示集合交集&#xff0c;非重叠处为独有元素。在生物学、统计学等领域广泛应用&#xff0c;可展示不同数据集相似性与差异&#xff0c;…...

【Vue.js】vue2 项目在 Vscode 中使用 Ctrl + 鼠标左键跳转 @ 别名导入的 js 文件和 .vue 文件

js 文件跳转 需要安装插件 Vetur 然后需要我们在项目根目录下添加 jsconfig.json 配置&#xff0c;至于配置的作用&#xff0c;可以参考我的另外一篇博客&#xff1a; 【React 】react 创建项目配置 jsconfig.json 的作用 它主要用于配置 JavaScript 或 TypeScript 项目的根…...

NVM配置与Vue3+Vite项目快速搭建指南

本文目录 1、配置环境1.1 NVM1、nvm常用命令 1.2 Mac配置环境1、安装nvm 1.3 Window配置环境1、安装nvm 2、 项目搭建2.1 项目依赖2.2 安装依赖2.3 配置1、别名配置2、创建样式及图片文件夹3、路由 2.4 项目搭建效果2.5 项目结构 在当今快速发展的前端技术领域中&#xff0c;掌…...

面试“利器“——微学时光

大家好&#xff0c;我是程序员阿药。微学时光是一款专为计算机专业学生和IT行业求职者设计的面试刷题小程序&#xff0c;它汇集了丰富的计算机面试题和知识点&#xff0c;旨在帮助用户随时随地学习和复习&#xff0c;提高自身的技术能力和面试技巧。 主题 随时随地学习&#x…...

【Unity】【游戏开发】游戏引擎是如何模拟世界的

【核心感悟】 游戏引擎通过两个维度的合并来模拟这个时间。 一个维度叫物理模型。 一个维度叫视觉模型。 对于物理模型&#xff0c;我们需要用物理引擎给予行为。 对于视觉模型&#xff0c;我们需要用动画去给予行为。 物理模型是真实机制&#xff0c;视觉模型是艺术表现&…...

vscode配置conda虚拟环境【windows系统】

安装好anacondavscode里安装python插件 3.点击左侧插件 如图1&#xff0c;再2&#xff0c;再点击3小星星激活conda环境 最后下方栏就出现conda环境了。就可以用啦...

libgpiod在imx8平台交叉编译说明

如下记录是在 imx8上测试使用 参考博主的文章 iMX6ULL 库移植 | Libgpiod 库的交叉编译及使用指南(linux) 编译说明 1: build.sh代码如下所示&#xff0c;先执行 source build.sh&#xff0c;注意修改交叉编译工具链为自己本地的地址&#xff1b; 2&#xff1a;执行 ./autogen…...

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器&#xff0c;实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件&#xff0c;主要包括&a…...

performance.timing

performance.timing 是 Web 性能 API 的一部分&#xff0c;用于获取页面加载过程中的各个时间戳。这些时间戳可以帮助开发者分析页面加载性能&#xff0c;找出潜在的瓶颈。performance.timing 返回一个 PerformanceTiming 对象&#xff0c;该对象包含了多个属性&#xff0c;每个…...

教你不用下载 maven,不用配置环境变量,在 idea 上创建 maven 项目

我的主页&#xff1a;2的n次方_ 1. Maven Maven是⼀个项⽬管理⼯具, 通过 pom.xml ⽂件的配置获取 jar 包&#xff0c;⽽不⽤⼿动去添加 jar 包&#xff0c;这样就大大的提高了开发效率 2. Maven 的核心功能 2.1. 项目构建 创建第一个 Maven 项目 Maven 提供了标准的…...

linux 设置tomcat开机启动

在Linux系统中&#xff0c;要配置Tomcat开机自启动&#xff0c;可以创建一个名为 tomcat.service 的 systemd 服务文件&#xff0c;并将其放置在 /etc/systemd/system/ 目录下。以下是一个基本的服务文件示例&#xff0c;假设Tomcat安装在 /usr/local/tomcat 路径下&#xff1a…...

opencv出错以及解决技巧

opencv配置 一开始&#xff0c;include的路径是<opencv4/opencv2/…> 这样在using namespace cv的时候导致了报错&#xff0c; 所以在cmakelist中需要对cmake的版本进行升级。 set(CMAKE_CXX_FLAGS “-stdc14 -O0 -Wall”)-O0 表示在编译过程中不进行任何优化 对应的pac…...

Python爬虫进阶(实战篇一)

接&#xff0c;基础篇&#xff0c;链接&#xff1a;python爬虫入门&#xff08;所有演示代码&#xff0c;均有逐行分析&#xff01;&#xff09;-CSDN博客 目录 1.爬取博客网站全部文章列表 ps:补充&#xff08;正则表达式&#xff09; 爬虫实现 爬虫代码&#xff1a; 2.爬…...

运维面试题(2)

ssh服务&#xff08;重点&#xff09;协议使用 端口 号&#xff1a;默认是 22&#xff0c; 可以是被修改的&#xff0c;如果需要修改&#xff0c;则需要修改 ssh 服务的配置文件&#xff1a;#/etc/ssh/ssh_config&#xff0c;可以通过这个配置文件来修改端口 端口号可以修改&am…...

Django CSRF Token缺失或不正确

在Django中&#xff0c;CSRF&#xff08;跨站请求伪造&#xff09;验证失败&#xff0c;提示“CSRF token missing or incorrect”的错误&#xff0c;通常是由以下几个原因造成的&#xff1a; 忘记在表单中添加 {% csrf_token %} 模板标签&#xff1a;这是最常见的原因之一。确…...

10.12Python数学基础-矩阵(下)

9.矩阵的转置 矩阵的转置&#xff08;Transpose&#xff09;是矩阵操作中的一种基本运算。它通过交换矩阵的行和列来生成一个新的矩阵。具体来说&#xff0c;如果 A 是一个 mn 的矩阵&#xff0c;那么它的转置矩阵 A^T 是一个 nm 的矩阵&#xff0c;其中 A^T 的第 i 行第 j 列…...

vue网络自学知识点汇总

初体验 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!--1.引入vue.j…...

Springboot项目Activemq延迟自定义消息完整代码案例(亲测可用)

1、porm.xml增加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId> </dependency> 2、application.properties增加配置 # 连接地址 spring.activemq.broker-url=fa…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...