¿Cómo obtengo el último ID insertado de una tabla MySQL en PHP?

93

Tengo una tabla en la que se insertan con frecuencia nuevos datos. Necesito obtener la última identificación de la tabla. ¿Cómo puedo hacer esto?

¿Es similar a SELECT MAX(id) FROM table?

gweg
fuente
1
sí, esta consulta devolverá la última identificación de la tabla. Pero una condición es que el ID debe ser la clave principal. Para que puedas evitar el arrepentimiento.
Sathish
7
@sathish: El principal problema de ese método es la concurrencia .
Christian C. Salvadó
3
Para elaborar: el problema con esto es que si alguien más inserta algo en la tabla entre tu INSERTconsulta y MAX(id), es posible que obtengas una identificación que no sea tu última identificación.
diciembre
3
@Jocelyn esa pregunta se hizo un año después con miles de visitas menos que esta pregunta.
Naftali alias Neal
3
@Neal, tienes razón. La otra pregunta debe cerrarse como duplicado de esta.
Jocelyn

Respuestas:

133

Si está usando PDO, use PDO::lastInsertId.

Si está usando Mysqli, use mysqli::$insert_id.

Si todavía está usando Mysql:

Por favor, no use mysql_*funciones en código nuevo . Ya no se mantienen y están oficialmente en desuso . ¿Ves el cuadro rojo ? En sulugar,aprenda sobre declaraciones preparadas y use PDO o MySQLi ; este artículo lo ayudará a decidir cuál. Si elige PDO, aquí hay un buen tutorial .

Pero si es necesario, use mysql_insert_id.

deceze
fuente
El problema con este es que si tiene muchas inserciones (por ejemplo, su base de datos también registra algo), puede obtener la ID incorrecta.
Mike
@Mike No si lo usa mysql_insert_id justo después de su mysql_query. Si, por supuesto, ejecuta varias otras consultas en la misma conexión en el medio, bueno, no hay nada que pueda ayudarlo allí.
diciembre
7
Para garantizar que NUNCA obtendrá una identificación incorrecta, envuelva su código con una TRANSACCIÓN .
Marcelo Assis
28
mysql se asegura de que este sea el último ID DE LA CONEXIÓN ACTUAL, por lo que no habrá problemas si coloca esta declaración justo después de la consulta de inserción. No se preocupe por otros procesos que hacen inserciones, no es necesario envolver esto en una transacción. El manual de mysql dice: "La ID que se generó se mantiene en el servidor por conexión. Esto significa que el valor devuelto por la función a un cliente dado es el primer valor AUTO_INCREMENT generado para la declaración más reciente que afecta a una columna AUTO_INCREMENT por ese cliente . Esta es la razón por la que no debe utilizar el MAX (ID)
selecto
1
@deceze, ¿Qué pasa con esta PDOparcialidad que vemos en todas partes? Veamos nuevamente la comparación de características . Está claro que mysqlies el ganador cuando necesitas ensuciarte las manos con cosas de bajo nivel. En otras palabras, incluso si uno elige PDO, eventualmente necesitará usarlo de mysqlitodos modos.
Pacerier
53

hay una función para saber cuál fue la última identificación insertada en la conexión actual

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

además, usar max es una mala idea porque podría ocasionar problemas si su código se usa al mismo tiempo en dos sesiones diferentes.

Esa función se llama mysql_insert_id

RageZ
fuente
2
mysql _ (...) está obsoleto en la versión PHP> = 5.5.
Iago
Sí, solo lo estoy recordando. :)
Iago
22

Está bien. También puede usar LAST_INSERT_ID ()

x2.
fuente
1
¿Por qué dices que select max(id)from tableestá bien?
Pacerier
8

Lo que escribiste te daría lo mejor idasumiendo que fueran únicos y autoincrementados, eso estaría bien asumiendo que estás de acuerdo con invitar a problemas de concurrencia.
Dado que está utilizando MySQL como su base de datos, existe una función específica LAST_INSERT_ID()que solo funciona en la conexión actual que hizo la inserción.
PHP ofrece una función específica para eso también llamado mysql_insert_id.

dlamblin
fuente
6

Prueba esto debería funcionar bien:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);
Sandhu
fuente
1
Gracias por notarlo. He editado el código, en realidad es $ link (variable que mantiene la conexión)
Sandhu
3

Puede obtener la última identificación insertada mediante la función php incorporada mysql_insert_id();

$id = mysql_insert_id();

también obtienes la última identificación por

$id = last_insert_id();
Rahul
fuente
4
Además, esto es incorrecto porque sugiere usar una biblioteca obsoleta. De verdad, elimine esto
STT LCU
@STTLCU ¿Qué fragmento de este código está obsoleto?
TheBlackBenzKid
@TheBlackBenzKid ambos, porque están basados ​​en funciones mysql_ *
STT LCU
@Rahul $ id = last_insert_id (); no funciona, ya que puede estar en desuso.
Esha
3

Para obtener la última identificación insertada en codeigniter Después de ejecutar la consulta de inserción, solo use una función llamada insert_id()en la base de datos, devolverá la última identificación insertada

Ex:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

en una línea

echo $this->db->insert('mytable',$data)->insert_id();
Narsimha
fuente
3

Está bien usarlo mysql_insert_id(), pero hay una nota específica sobre su uso, debe llamarlo después de ejecutar la consulta INSERT, es decir, en la misma sesión de script. Si lo usa, de lo contrario, no funcionaría correctamente.

Mihail Dimitrov
fuente
2

Limpio y simple -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
Hitesh
fuente
1

NOTA: si hace varias inserciones con una declaración, mysqli :: insert_id no será correcto.

La mesa:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Ahora si lo hace:

insert into xyz (name) values('one'),('two'),('three');

El mysqli :: insert_id será 1, no 3.

Para obtener el valor correcto, haga lo siguiente:

mysqli::insert_id + mysqli::affected_rows) - 1

Esto ha sido un documento, pero es un poco oscuro.

bartonlp
fuente
1

Prefiero usar una sintaxis MySQL pura para obtener la última identificación de auto_increment de la tabla que quiero.

php mysql_insert_id () y mysql last_insert_id () dan solo el ID de la última transacción.

Si desea el último ID auto_incrementado de cualquier tabla en su esquema (no solo la última transacción uno), puede usar esta consulta

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

Eso es.

syjust
fuente
tengo dudas sobre esto, ya que este SQL es simplemente incorrecto en el contexto de la pregunta ... Además, este método se siente propenso a posibles condiciones de carrera cuando dos o más clientes ejecutan este SQL aproximadamente al mismo tiempo ... no estoy seguro qué tan rápido se actualizan los datos de esta columna después de una inserción, lo que me hace dudar ... Las funciones PHP que pueden obtener la última identificación se basan en el nivel de conexión / sesión (hace más o menos lo mismo que LAST_INSERT_ID () de MySQL ) lo que hace que se guarde la condición de carrera
Raymond Nijland
1

Es triste no ver ninguna respuesta con un ejemplo.

Usando Mysqli :: $ insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Usando PDO :: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
Oxido
fuente
0

Usando la MySQLitransacción que a veces no pude obtener mysqli::$insert_id, porque devolvió 0. Especialmente si estaba usando procedimientos almacenados, que ejecutando INSERTs. Entonces hay otra forma dentro de la transacción:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>
Bombardeo aéreo
fuente
0

Use mysqli ya que mysql está depricando

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>
Poorna Rao
fuente
0

Lo intenté

mysqli_insert_id ($ dbConnectionObj)

Esto devuelve la última identificación insertada de la conexión actual, por lo que si está administrando sus conexiones correctamente, esto debería funcionar. Funcionó para mí al menos.

usuario2166373
fuente
0

Utilice PDP y luego intente esto

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();
Humphrey
fuente
-1

$ lastid = mysql_insert_id ();

Treby
fuente
-1

Por toda esta discusión, supongo que la razón para verificar la identificación máxima es saber qué identificación debería ser la siguiente ... (si mi identificación máxima es 5, la siguiente será 5 + 1 = 6).

>> Si este no es el motivo, mis mejores disculpas

Caso si alguien más INSERTA información entre su CHECK e INSERT le daría una identificación incorrecta.

Por lo tanto, se puede resolver si crea un hash que podría incluir una marca de tiempo u otro valor único.

Luego, en la misma función, puede insertar su información con valores vacíos y su hash. Eso crearía una identificación si tiene AUTO_INCRECEMENT seleccionado.

Luego, en la misma función, todavía tendría su hash y podría buscar una identificación con el mismo hash. Y luego podría completar el llenado de valores vacíos con mysql UPDATE.

Esto incluye un poco más de conexiones, pero sigue siendo una forma de hacerlo ...

Buena suerte resolviéndolo.

Aurimas
fuente
-2

Si su tabla tiene una columna AUTO INCREMENT como UserID, Emp_ID, .. entonces puede usar esta consulta para obtener el último registro insertado SELECT * FROM table_name donde UserID = (seleccione MAX (UserID) de table_name) En código PHP:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

Entonces puede usar los datos obtenidos como requisito

Naveen1425
fuente
No cifre las contraseñas , cuando el atacante obtenga la base de datos, también obtendrá la clave de cifrado.
zaph
-3
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
Khamar Balkrishna
fuente