una ultimo tabla registro primer obtener mostrar last_insert_id insertado como php mysql

php - ultimo - ¿Cómo obtener ID de la última fila actualizada en MySQL?



obtener ultimo id insertado mysql php (12)

¿Cómo obtengo el ID de la última fila actualizada en MySQL usando PHP?


Consulta :

$sqlQuery = "UPDATE update_table SET set_name = ''value'' WHERE where_name = ''name'' LIMIT 1;";

Función de PHP:

function updateAndGetId($sqlQuery) { mysql_query(str_replace("SET", "SET id = LAST_INSERT_ID(id),", $sqlQuery)); return mysql_insert_id(); }

Es trabajo para mí;)


El ID de la última fila actualizada es la misma ID que usas en la ''updateQuery'' para encontrar y actualizar esa fila. Por lo tanto, solo guarde (llame) esa ID de la forma que desee.

last_insert_id() depende de AUTO_INCREMENT , pero la última ID actualizada no.


Este es el mismo método que la respuesta de Salman A, pero aquí está el código que realmente necesita para hacerlo.

En primer lugar, edite su tabla para que se haga un seguimiento automático de cada vez que se modifique una fila. Elimine la última línea si solo desea saber cuándo se insertó inicialmente una fila.

ALTER TABLE mytable ADD lastmodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Luego, para averiguar la última fila actualizada, puede usar este código.

SELECT id FROM mytable ORDER BY lastmodified DESC LIMIT 1;

Este código se elimina de MySQL vs PostgreSQL: Agregar una columna de ''Última hora modificada'' a una tabla y Manual de MySQL: Ordenando filas . Acabo de armarlo.


Esto es oficialmente simple pero notablemente contra-intuitivo. Si estás haciendo:

update users set status = ''processing'' where status = ''pending'' limit 1

Cambiarlo a esto:

update users set status = ''processing'' where status = ''pending'' and last_insert_id(user_id) limit 1

La adición de last_insert_id(user_id) en la cláusula where indica a MySQL que establezca su variable interna en el ID de la fila encontrada. Cuando pasa un valor a last_insert_id(expr) como este, termina devolviendo ese valor, que en el caso de los ID como aquí es siempre un entero positivo y, por lo tanto, siempre se evalúa como verdadero, sin interferir con la cláusula where. Esto solo funciona si realmente se encontró alguna fila, así que recuerde verificar las filas afectadas. A continuación, puede obtener la identificación de varias maneras.

MySQL last_insert_id()

Puede generar secuencias sin llamar a LAST_INSERT_ID (), pero la utilidad de usar la función de esta manera es que el valor de ID se mantenga en el servidor como el último valor generado automáticamente. Es seguro para múltiples usuarios porque varios clientes pueden emitir la instrucción UPDATE y obtener su propio valor de secuencia con la instrucción SELECT (o mysql_insert_id ()), sin afectar o ser afectado por otros clientes que generan sus propios valores de secuencia.

MySQL mysql_insert_id()

Devuelve el valor generado para una columna AUTO_INCREMENT por la instrucción INSERT o UPDATE previa. Utilice esta función después de haber realizado una instrucción INSERT en una tabla que contenga un campo AUTO_INCREMENT, o haya utilizado INSERT o UPDATE para establecer un valor de columna con LAST_INSERT_ID (expr).

El motivo de las diferencias entre LAST_INSERT_ID () y mysql_insert_id () es que LAST_INSERT_ID () se hace fácil de usar en las secuencias de comandos, mientras que mysql_insert_id () intenta proporcionar información más exacta sobre lo que ocurre con la columna AUTO_INCREMENT.

PHP mysqli_insert_id()

La realización de una instrucción INSERT o UPDATE utilizando la función LAST_INSERT_ID () también modificará el valor devuelto por la función mysqli_insert_id ().

Poniendolo todo junto:

$affected_rows = DB::getAffectedRows(" update users set status = ''processing'' where status = ''pending'' and last_insert_id(user_id) limit 1" ); if ($affected_rows) { $user_id = DB::getInsertId(); }

(Para su información, la clase DB está aquí ).


He encontrado una respuesta a este problema :)

SET @update_id := 0; UPDATE some_table SET column_name = ''value'', id = (SELECT @update_id := id) WHERE some_other_column = ''blah'' LIMIT 1; SELECT @update_id;

EDITAR por aefxx

Esta técnica se puede ampliar aún más para recuperar el ID de cada fila afectada por una declaración de actualización:

SET @uids := null; UPDATE footable SET foo = ''bar'' WHERE fooid > 5 AND ( SELECT @uids := CONCAT_WS('','', fooid, @uids) ); SELECT @uids;

Esto devolverá una cadena con todos los ID concatenados por dos puntos.


Hm, estoy sorprendido de que entre las respuestas no veo la solución más fácil.

Supongamos que item_id es una columna de identidad entera en la tabla de items y actualiza las filas con la siguiente declaración:

UPDATE items SET qwe = ''qwe'' WHERE asd = ''asd'';

Luego, para conocer la última fila afectada inmediatamente después de la declaración, debe actualizar levemente la declaración en lo siguiente:

UPDATE items SET qwe = ''qwe'', item_id=LAST_INSERT_ID(item_id) WHERE asd = ''asd''; SELECT LAST_INSERT_ID();

Si necesita actualizar solo la fila realmente modificada, deberá agregar una actualización condicional de item_id a través de LAST_INSERT_ID para verificar si los datos van a cambiar en la fila.


Más aún a la respuesta aceptada anteriormente
Para aquellos que se preguntaban acerca de := & =

Diferencia significativa entre := y = , y eso es que := funciona como un operador de asignación de variables en todas partes, mientras que = solo funciona de esa manera en las sentencias SET, y es un operador de comparación en cualquier otro lugar.

Entonces SELECT @var = 1 + 1; dejará @var sin cambios y devolverá un valor booleano (1 o 0 según el valor actual de @var), mientras que SELECT @var := 1 + 1; cambiará @var a 2 y devolverá 2 . [Source]


Mi solución es, primero, decidir el "id" (@uids) con el comando de selección y después de actualizar esta identificación con @uids.

SET @uids := (SELECT id FROM table WHERE some = 0 LIMIT 1); UPDATE table SET col = 1 WHERE id = @uids;SELECT @uids;

funcionó en mi proyecto


No es necesario un código Mysql tan largo. En PHP, la consulta debería verse más o menos así:

$updateQuery = mysql_query("UPDATE table_name SET row=''value'' WHERE id=''$id''") or die (''Error''); $lastUpdatedId = mysql_insert_id();


Oye, solo necesitaba ese truco, lo resolví de otra manera, tal vez funcione para ti. Tenga en cuenta que esta no es una solución escalable y será muy mala para grandes conjuntos de datos.

Divida su consulta en dos partes:

primero, seleccione los identificadores de las filas que desea actualizar y guárdelos en una tabla temporal.

en segundo lugar, la actualización original con la condición en la declaración de actualización cambió a where id in temp_table .

Y para garantizar la simultaneidad, debe lock la tabla antes de estos dos pasos y luego liberar el bloqueo al final.

De nuevo, esto funciona para mí, para una consulta que finaliza con el limit 1 , por lo que ni siquiera utilizo una tabla temporal, sino simplemente una variable para almacenar el resultado de la primera select .

Prefiero este método, ya que sé que siempre actualizaré solo una fila, y el código es directo.


Si solo está haciendo inserciones y quiere una de la misma sesión, hágalo según la respuesta de Peirix. Si está haciendo modificaciones, deberá modificar su esquema de base de datos para almacenar qué entrada se actualizó más recientemente.

Si quiere la identificación de la última modificación, que puede haber sido de una sesión diferente (es decir, no la que acaba de hacer el código PHP que se está ejecutando actualmente, sino uno hecho en respuesta a una solicitud diferente), puede agregar una La columna TIMESTAMP de su tabla denominada last_modified (consulte http://dev.mysql.com/doc/refman/5.1/en/datetime.html para obtener información), y luego cuando actualice, configure last_modified = CURRENT_TIME.

Una vez configurado esto, puede usar una consulta como: SELECCIONAR ID FROM tabla ORDER BY last_modified DESC LIMIT 1; para obtener la fila modificada más recientemente.


SET @uids := ""; UPDATE myf___ingtable SET id = id WHERE id < 5 AND ( SELECT @uids := CONCAT_WS('','', CAST(id AS CHAR CHARACTER SET utf8), @uids) ); SELECT @uids;

Tuve que LANZAR la identificación (no sé por qué) ... o no puedo obtener el contenido de @uids (era una gota) Por cierto, ¡muchas gracias por la respuesta de Pomyk!