2010-06-28 30 views
6

Estoy tratando de recuperar el ID de una tabla A para insertar en otra tabla B. No puedo usar last_insert_id() ya que no he insertado nada en A. Cualquier idea sobre cómo hacerlo ¿bien? no pareceSELECCIONE la última identificación, sin INSERTAR

$n = mysql_query("SELECT max(id) FROM tablename"); a trabajar, ni

$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id"); 
+0

¿Qué motor? mysql, mssql? ¿acceso? – masfenix

+0

¿Qué quiere decir con "no parece funcionar"? –

+0

Definir "no parece funcionar". ¿Qué no funciona? ¿Qué devuelve? ¿Qué debería ser? – CaffGeek

Respuesta

15

En MySQL, esto hace devolver el valor más alto de la columna de id:

SELECT MAX(id) FROM tablename; 

Sin embargo, esto no pone ese id en $n:

$n = mysql_query("SELECT max(id) FROM tablename"); 

Para obtener el valor, que tiene que hacer esto:

$result = mysql_query("SELECT max(id) FROM tablename"); 

if (!$result) { 
    die('Could not query:' . mysql_error()); 
} 

$id = mysql_result($result, 0, 'id'); 

Si desea obtener el último ID de inserción de la A, y la inserta en B, puede hacerlo con un solo comando:

INSERT INTO B (col) SELECT MAX(id) FROM A; 
0

pienso para añadir marca de tiempo para cada registro y obtener lo último. En esta situación, puedes obtener identificadores, filas de paquetes y otras operaciones.

0

Puede get maximum column value and increment it:

InnoDB utiliza el siguiente algoritmo para inicializar el contador aún de una tabla T que contiene una columna AUTO_INCREMENT llamada ai_col: Después de un arranque del servidor, por primera insertar en una tabla T, InnoDB ejecuta el equivalente de esta declaración:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

InnoDB incrementa en uno el valor recuperado por la instrucción y le asigna a la columna y al contador de autoincremento para la tabla. Si la tabla está vacía, InnoDB utiliza el valor 1.

También se puede usar SHOW TABLE STATUS y su valor "AUTO_INCREMENT".

+0

¿Cómo es seguro el hilo es esto? –

+0

"para actualización" significa que la tabla está bloqueada para escritura hasta que finalice la selección. Por supuesto, será mejor seleccionar el valor máximo e insertarlo en una transacción que bloquee estas dos tablas. – silent

+1

Bloqueo para escrituras ?! Ay. –

0

Se podría descender ordenar la tabele por id y limitar el número de resultados a uno:

SELECT id FROM tablename ORDER BY id DESC LIMIT 1 

PERO:ORDER BY reorganiza todo el mesa para esta solicitud. Entonces, si tiene muchos datos y necesita repetir esta operación varias veces, no recomendaría esta solución.

Cuestiones relacionadas