数据库插入后无法获取自增id问题求助
解决MySQL插入后获取自增ID报错“Column 'id' not found”的问题
问题根源
你的代码中调用statement.getGeneratedKeys()获取自增ID后,直接调用resultSet.getInt("id"),但ResultSet的初始指针位于第一行数据之前,此时直接访问列会触发“Column 'id' not found”错误。另外,statement.getResultSet()仅用于获取查询语句(如SELECT)的结果集,插入操作无查询结果,因此调用它会引发意外错误。
修复后的代码
修改插入方法中处理GeneratedKeys的逻辑,先执行插入操作,再通过resultSet.next()将指针移动到有效行,最后获取ID:
public SignShop insertSignShopSpec(Location location) { String query = "INSERT INTO `%s` (`location_x`, `location_y`, `location_z`, `location_world`, `custom_item`) VALUES (?, ?, ?, ?, ?);"; try ( Connection connection = this.getConnection(); PreparedStatement statement = connection.prepareStatement( String.format( query, SignShopConstants.Databases.Mysql.Tables.SIGN_SHOP_TABLE_NAME ), Statement.RETURN_GENERATED_KEYS ); ) { statement.setDouble(1, location.getX()); statement.setDouble(2, location.getY()); statement.setDouble(3, location.getZ()); statement.setString(4, location.getWorld().getName()); statement.setBoolean(5, false); // 执行插入操作 int affectedRows = statement.executeUpdate(); if (affectedRows == 0) { throw new SQLException("插入SignShop失败,无行受影响"); } ResultSet resultSet = statement.getGeneratedKeys(); // 移动指针到结果行 if (resultSet.next()) { int generatedId = resultSet.getInt("id"); return new SignShop( generatedId, location, null, null, null, null, false, null ); } else { throw new SQLException("插入SignShop失败,无法获取自增ID"); } } catch (SQLException exception) { exception.printStackTrace(); } return null; }
关键修改点
- 补充
statement.executeUpdate():之前的代码遗漏了插入执行步骤,导致实际未写入数据,ResultSet无内容 - 增加
resultSet.next()调用:将结果集指针移动到包含自增ID的有效行 - 增加异常判断:处理插入失败或无法获取ID的场景
额外验证
确认你的MySQL JDBC驱动版本兼容,Statement.RETURN_GENERATED_KEYS在MySQL驱动中会正确返回自增的id列,你的建表语句中id已配置为AUTO_INCREMENT PRIMARY KEY,结构无问题。
内容的提问来源于stack exchange,提问作者Jean Flores
相关产品推荐
相关产品推荐

