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.
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_idjusto 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.
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.
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
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.
$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
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
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:
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.
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 ...
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
INSERT
consulta yMAX(id)
, es posible que obtengas una identificación que no sea tu última identificación.Respuestas:
Si está usando PDO, use
PDO::lastInsertId
.Si está usando Mysqli, use
mysqli::$insert_id
.Si todavía está usando Mysql:
Pero si es necesario, use
mysql_insert_id
.fuente
mysql_insert_id
justo después de sumysql_query
. Si, por supuesto, ejecuta varias otras consultas en la misma conexión en el medio, bueno, no hay nada que pueda ayudarlo allí.PDO
parcialidad que vemos en todas partes? Veamos nuevamente la comparación de características . Está claro quemysqli
es el ganador cuando necesitas ensuciarte las manos con cosas de bajo nivel. En otras palabras, incluso si uno elige PDO, eventualmente necesitará usarlo demysqli
todos modos.hay una función para saber cuál fue la última identificación insertada en la conexión actual
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
fuente
Está bien. También puede usar LAST_INSERT_ID ()
fuente
select max(id)from table
está bien?Con DOP :
Con Mysqli :
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 .fuente
PDO
parcialidad que ........Lo que escribiste te daría lo mejor
id
asumiendo 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
.fuente
Prueba esto debería funcionar bien:
fuente
Puede obtener la última identificación insertada mediante la función php incorporada
mysql_insert_id();
también obtienes la última identificación por
fuente
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 insertadaEx:
en una línea
fuente
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.fuente
Limpio y simple -
fuente
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.
fuente
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
Eso es.
fuente
Es triste no ver ninguna respuesta con un ejemplo.
Usando Mysqli :: $ insert_id :
Usando PDO :: lastInsertId :
fuente
Usando la
MySQLi
transacción que a veces no pude obtenermysqli::$insert_id
, porque devolvió 0. Especialmente si estaba usando procedimientos almacenados, que ejecutandoINSERT
s. Entonces hay otra forma dentro de la transacción:fuente
Use mysqli ya que mysql está depricando
fuente
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.
fuente
Utilice PDP y luego intente esto
fuente
$ lastid = mysql_insert_id ();
fuente
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.
fuente
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:
Entonces puede usar los datos obtenidos como requisito
fuente
fuente