JDBC获取新插入记录id的三种方法

本文介绍在JDBC中通过三种方式获取新插入记录ID的方法:执行查询语句、使用generatedKeys和调用存储过程。

JDBC获取新插入记录id的三种方法

在一对多的关联操作中,通常在一方插入记录后,需要获取到当前记录的id,以方便进行多方的插入操作。要解决这一问题,在JDBC中至少有三种不同的实现方法:

1.在插入语句后添加一条查询,利用resultset来得到id号
psmt = con.prepareStatement ("insert into orders (receiver,address,telephone,total,detailnum,userid)values(?,?,?,?,?,?)");
psmt.setString(1, order.getReceiver());
……

psmt.executeUpdate();

psmt = con.prepareStatement ("select @@identity");

results = psmt.executeQuery();
if(results.next()){
num = results.getInt(1);
}
2.利用generatedKey来获取id
psmt = con.prepareStatement("insert into orders (receiver,address,telephone,total,detailnum,userid)values(?,?,?,?,?,?)");
psmt.setString(1, order.getReceiver());
……
psmt.executeUpdate();
results = psmt.getGeneratedKeys();
int num = -1;
if(results.next()) {
num = results.getInt(1);
}

3.调用存储过程来实现,当然这种情况下,插入对象的属性不宜过多,否则存储过程的输入参数太多。在存储过程中,将id作为输出参数返回
CallableStatement proc = conn.prepareCall("{call proc_insert(?,?,?)}");
proc.setString(1, cardname);
proc.setInt(2, money);
proc.registerOutParameter(3, Types.INTEGER);
proc.execute();
int num = proc.getInt(3)

在 MySQL 中,获取插入记录后生成的自增 ID 可以通过 `LAST_INSERT_ID()` 函数实现。该函数返回当前数据库连接中最近一次 `INSERT` 操作生成的自增主键值,适用于具有 `AUTO_INCREMENT` 属性的列[^1]。 该函数的使用方式非常简单,通常在插入数据后立即调用: ```sql INSERT INTO users (name) VALUES ('Alice'); SELECT LAST_INSERT_ID(); ``` 上述语句中,`SELECT LAST_INSERT_ID()` 返回刚刚插入记录的主键值。该函数基于连接(Connection)维护,因此不会受到其他连接操作的影响,保证了并发环境下的准确性[^4]。 需要注意的是,如果插入操作中使用了 `ON DUPLICATE KEY UPDATE` 子句,并且触发了更而非插入操作,`LAST_INSERT_ID()` 不会返回当前表的主键,而是返回上一次成功插入操作生成的 ID。这是因为 `LAST_INSERT_ID()` 仅在实际发生插入时更其值,而更操作不会影响它[^3]。 此外,当一次插入多条记录时,`LAST_INSERT_ID()` 返回的是第一个插入记录ID。例如: ```sql INSERT INTO users (name) VALUES ('Alice'), ('Bob'); SELECT LAST_INSERT_ID(); ``` 上述语句将返回 `Alice` 对应记录ID。 在 Java 等编程语言中使用 JDBC 操作数据库时,也可以通过 `Statement` 或 `PreparedStatement` 的 `getGeneratedKeys()` 方法获取自增主键,但 `LAST_INSERT_ID()` 依然是一个更轻量、更灵活的选择,尤其在需要兼容不同数据库或使用连接池的场景中表现更佳。 ### 注意事项 - `LAST_INSERT_ID()` 仅适用于 `INSERT` 操作,且必须是在生成自增 ID 的操作之后立即调用。 - 多个表之间共享该函数的返回值,因此在插入不同表时需注意上下文切换可能导致的 ID 不一致问题。 - 在使用 `ON DUPLICATE KEY UPDATE` 时,若触发更操作,`LAST_INSERT_ID()` 返回的 ID 并非当前表插入ID,而是上一次插入操作的 ID[^3]。 ### 示例代码(Python) ```python import pymysql connection = pymysql.connect(host='localhost', user='user', password='password', db='test_db') try: with connection.cursor() as cursor: # 插入数据 sql = "INSERT INTO users (name) VALUES (%s)" cursor.execute(sql, ('Alice',)) # 获取插入ID cursor.execute("SELECT LAST_INSERT_ID()") result = cursor.fetchone() print("插入ID为:", result[0]) connection.commit() finally: connection.close() ``` ### 相关问题 1. MySQL 中 LAST_INSERT_ID() 函数的工作原理是什么? 2. 在多线程环境下,为什么不能使用 SELECT MAX(id) 来获取插入ID? 3. 使用 LAST_INSERT_ID() 是否需要事务支持? 4. MySQL 插入多条记录时,LAST_INSERT_ID() 返回的是哪个 ID? 5. 如何在 Java 中使用 LAST_INSERT_ID() 获取插入记录的自增 ID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值