El valor generado para un ID autoincremental después de una consulta tipo INSERT

¿Alguna vez me imagino que todos en este foro han necesitado saber el valor generado para un ID autoincremental después de una consulta tipo INSERT? seguramente para insertarlo en otra tabla y con ello crear la relacion entre estas

Se puede hacer una consulta SELECT para encontrar el id más alto en esa tabla o el max(ID), esto muy poco recomendable desde luego ya que se podria dar con el ultimo id de otro insert hecho por otro usuario Y SE HARIA UN LIO GRANDE A LA HORA DE HACER LOS LIGUES ENTRE TABLAS

Ahora bien me han recomendado usar mysql_insert_id() a lo que yo no estoy del todo seguro ya que tengo entendido que con este SURGIRIA EL MISMO PROBLEMA

Gente se que es una duda como que muy basica pero quiero matar esta duda de una vez por todas y prefiero hacer una pregunta ingnorante que quedarme ignorante dicho sea de paso

CUAL SERA LA MEJOR FORMA EN ESTE TIPO DE CASOS!!!???

Saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Re: ID autoincremental

mysql_insert_id()

Es una función para PHP ... este es un foro de Java.

Puedes consultar en la pägina de php http://php.net/manual/es/function.mysql-insert-id.php

También te serviría ver esto: http://crear-paginas-web.blogspot.mx/2008/08/en-php-recuperar-el-ultimo-id-de-un.html

En Java puedes usar esto (tomado de aqui)

int id = 0;

String query = "SELECT NEXTVAL('some_seq_name')"

java.sql.ResultSet rs = statement.executeQuery(query);

try {
 if (rs.next()) {
  id = rs.getInt(1);
  }
 }
catch(java.sql.SQLException sqle) {
 sqle.printStackTrace();
 }

Para recuperar el último valor del id autoincremental.

Imagen de The man

Al punto que queria llegar

Es correcto mysql_insert_id() es de php,pero la pregunta biene enfocada a cualquier lenguaje,porque como sabes sea cual sea el lenguaje de programacion por abajo lo que usamos es SQL para guardar la info, varian los motores como lo son oracle,sql server,nySQL etc..

Perdon si no supe plasmar bien mi interrogante,La pregunta es esa? como estoy seguro que no estoy tomando el id autogenerado por el insert de otro usuario.

Gracias por tu tiempo

Imagen de neko069

Secuencia.

Chéca como se crea una secuencia en el manejador de base de datos que estés usando, y con una consulta, obtienes su valor.
La parte de la consulta ya te la facilitó el siñor negativo, checa lo de la secuencia.

Cuidado con las secuencias

Podrias tener la tabla cosa acompañada de la secuencia seq_cosa. Eso te permite hacer:

# obtener el ID del registro
identificador= ejecutaQuery (select seq_cosa.nextval from dual)

# estableces el identificador a persistir
cosa.id = identificador

# guardas en base de datos la informacion
guardar (cosa)

Notarás que incluso antes de guardar puedes saber cual es el ID con que el registro será identificado en DB. Segun la practica cuando consultas una secuencia en un contexto transaccional, si algo falla y se realiza el rollback entonces pdrias tener ID's de la Tabla X saltados pero ese no es problema si tu sistema no tiene una restricción que deben ser todos los id consecutivos sin brincarse ninguna posicion.

Imagen de ezamudio

JDBC

En JDBC hay una manera en que puedes hacer un INSERT y que te devuelve las llaves generadas, existe precisamente para estos casos. Es algo así como:

PreparedStatement ps = conn.prepareStatement("INSERT INTO bla(blabla)");
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs != nul && rs.next()) {
  long llave = rs.getLong(1);
}

Los tipos pueden variar según tu DBMS.

JDBC

Saludos:
Estab buscando informacion y encontre loq ue dice el compañero EZAMUDIO y le hace falta a la conección ponerle

PreparedStatement.RETURN_GENERATED_KEYS

PreparedStatement ps = conn.prepareStatement("INSERT INTO bla(blabla)",PreparedStatement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs != nul && rs.next()) {
  long llave = rs.getLong(1);
}

esto para que te pueda regresar el valor generado