2012-01-15 5 views
6

Juego con JDBC/MySQL 5.1. Creé una consulta insert para insertar algunos datos en una tabla y quiero devolver la clave generada desde la fila recién creada. Sin embargo, cuando voy a referenciar la columna por "id", que es mi PK y la columna de incremento automático.¿Por qué getGeneratedKeys() devuelve "GENERATED_KEY" como nombre de columna?

PreparedStatement ps = St0rm.getInstance().getDatabase("main") 
     .prepare("INSERT INTO quests (name,minlevel,start_npc,end_npc) VALUES(?,?,?,?)", true); // creates a prepared statement with flag RETURN_GENERATED_KEYS 

// ... 

int affected = ps.executeUpdate(); 
ResultSet keys = ps.getGeneratedKeys(); 
if (affected > 0 && keys.next()) { 
    St0rm.getInstance().getLogger().warning(String.format("ID Column Name: %s", keys.getMetaData().getColumnName(1))); // says the column name is: GENERATED_KEY 

    q = new Quest(keys.getInt(1)); // column index from the generated key, no error thrown. 

    q = new Quest(keys.getInt("id")); // actual column name, line throws a SQLException 
    // ... 
} 

Por lo tanto, mi pregunta: ¿Por qué ResultSet.getGeneratedKeys uso GENERATED_KEY como el nombre de la columna?

Respuesta

3

No debe recuperar estas columnas por su nombre. Solo por índice, desde , solo puede haber una columna con MySQL y auto_increments que devuelva valores que pueden ser expuestos por Statement.getGeneratedKeys().

Actualmente el servidor MySQL no devuelve información directa que haría que la capacidad de recuperar estas columnas por su nombre de una manera eficiente posible, que es por eso que estoy marcando esto como "ser fijo más tarde", ya que podemos, una vez que el servidor devuelve la información en de una manera que el controlador puede usar.

De here (en 2006).

Cuestiones relacionadas