当前位置:首页 > 技术 > 正文内容

MySQL获取插入数据自增ID的七种实现方式

访客 技术 2026年7月14日 1

MySQL与Oracle在自增ID处理机制上存在差异:Oracle使用序列生成ID,而MySQL内置自增字段功能。本文将介绍插入数据后获取自增ID值的七种方法。

方法一:LAST_INSERT_ID()函数

SELECT LAST_INSERT_ID();

该函数基于数据库连接会话,每个独立连接返回自身最近插入操作生成的首个自增ID。支持批量插入返回ID列表,且不受其他会话影响。注意该函数与具体表无关,跨表操作会更新返回值。

方法二:MAX()函数查询

SELECT MAX(record_id) FROM data_table;

通过查询当前最大ID值获取最新ID。此方法在并发写入场景下可能返回不准确结果,仅适用于低频插入操作。

方法三:存储过程封装

DELIMITER //
CREATE PROCEDURE InsertAndFetchID(IN emp_name VARCHAR(50), OUT new_id INT)
BEGIN
  INSERT INTO employees(name) VALUES(emp_name);
  SELECT MAX(employee_id) FROM employees INTO new_id;
END //
DELIMITER ;

CALL InsertAndFetchID('John', @new_id);

创建存储过程将插入操作与ID查询封装为原子操作,通过OUT参数返回新ID值。

方法四:@@IDENTITY全局变量

SELECT @@IDENTITY;

返回当前连接中最近插入操作的自增列值。需在插入后立即执行且保持连接有效,否则返回NULL。

方法五:JDBC getGeneratedKeys()

Connection dbConn = ...;
PreparedStatement stmt = ...;
stmt.executeUpdate();
ResultSet keys = stmt.getGeneratedKeys();
if (keys.next()) {
  Long newKey = keys.getLong(1);
}

通过JDBC API直接获取生成的主键值,需在Statement执行后立即读取结果集。

方法六:MyBatis selectKey

<insert id="addRecord" parameterType="HashMap">
  INSERT INTO user_data(user_name) VALUES(#{name})
  <selectKey resultType="Integer" keyProperty="userId" order="AFTER">
    SELECT LAST_INSERT_ID()
  </selectKey>
</insert>

MyBatis中通过selectKey节点捕获插入后的ID值,MySQL需设置order="AFTER"。注解配置方式:

@Insert("INSERT INTO roles(role_name) VALUES(#{roleName})")
@SelectKey(statement="SELECT LAST_INSERT_ID()", 
           keyProperty="roleId", before=false, resultType=int.class)
int createRole(Role role);

方法七:MyBatis useGeneratedKeys

<insert id="insertDevice" parameterType="Device"
        useGeneratedKeys="true" keyProperty="deviceId">
  INSERT INTO devices(device_name) VALUES(#{deviceName})
</insert>
Device dev = new Device("Scanner");
mapper.insertDevice(dev);
Long newId = dev.getDeviceId();

通过useGeneratedKeys属性自动将自增ID注入实体对象属性,需确保keyProperty与对象属性名一致。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。