MySQL获取插入数据自增ID的七种实现方式
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与对象属性名一致。