2010-12-19 10 views
8

Estoy usando Java (jdbc) para interactuar con una base de datos MySQL. Tengo una tabla con un índice primario que es AUTO INCREMENTO. Cuando inserto una fila, necesito obtener el índice que acaba de recibir. ¿Cómo puedo hacer eso?Obtener índice de filas insertadas de una base de datos MySQL

+0

¿Cómo se puede utilizar este índice para buscar más rápido laster? – David

+2

@David: ¿qué quieres decir? Una clave principal siempre es un índice y, por lo tanto, siempre ayudará a buscar más rápido si consulta el índice. Haga una pregunta por separado si quiere más explicaciones :) – Konerak

+0

Pensé que una clave principal podría indexarse ​​y no es un índice en sí mismo. Creo que es perfectamente válido (aunque generalmente no se recomienda) usar un varchar (60) como clave principal. Sería interesante recuperar el índice de la clave primaria que se acaba de insertar y no el valor en sí. Más específicamente, sería útil obtener algún tipo de posición en el disco donde se almacenó el último registro para que se pueda modificar rápidamente si resulta que se debe modificar (por ejemplo, debido a que el usuario hace clic en un botón para deshacer) . Espero no estar secuestrando este dibujo ahora ... – David

Respuesta

7

Desde: http://dev.mysql.com/doc/refman/5.0/en/connector-j-usagenotes-basic.html#connector-j-usagenotes-last-insert-id

stmt.executeUpdate(
     "INSERT INTO autoIncTutorial (dataField) " 
     + "values ('Can I Get the Auto Increment Field?')", 
     Statement.RETURN_GENERATED_KEYS); 

// 
// Example of using Statement.getGeneratedKeys() 
// to retrieve the value of an auto-increment 
// value 
// 

int autoIncKeyFromApi = -1; 

rs = stmt.getGeneratedKeys(); 

if (rs.next()) { 
    autoIncKeyFromApi = rs.getInt(1); 
} else { 

    // throw an exception from here 
} 

rs.close(); 

rs = null; 
0

alternativa, utilizando Spring JDBC que se vería así:

Map<String, Object> map = new HashMap<String, Object>(); 
map.put("column1", "test"); 
map.put("column2", Boolean.TRUE); 

SimpleJdbcInsert insert = new SimpleJdbcInsert(template).withTableName("table").usingGeneratedKeyColumns("id"); 
int id = insert.executeAndReturnKey(map).intValue(); 
2

Gracias a John Boker por su excelente respuesta.

Si desea utilizar un PreparedStatement, todavía se puede utilizar RETURN_GENERATED_KEYS, pero hay que aplicar los comandos de manera diferente:

PreparedStatement ps = mysql.prepareStatement(
    "INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)", 
    Statement.RETURN_GENERATED_KEYS); 
ps.setString(1, "My text"); 
ps.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime());); 
ps.setInt(3, 5150); 
ps.executeUpdate(); 
ResultSet results = ps.getGeneratedKeys(); 
results.next(); // Assume just one auto-generated key; otherwise, use a while loop here 
System.out.println(results.getInt(1)); // there should only be 1 column in your results: the value of the auto-generated key 
  1. Añadir el parámetro RETURN_GENERATED_KEYS en la función prepareStatement() .
  2. Obtener resultados no de statement.executeUpdate() pero de statement.getGeneratedKeys().
Cuestiones relacionadas