mysql - tabla - obtener el valor maximo de una columna sql
¿Cómo puedo insertar muchas filas en una tabla de MySQL y devolver las nuevas ID? (5)
Normalmente puedo insertar una fila en una tabla de MySQL y recuperar el last_insert_id
. Ahora, sin embargo, quiero insertar de forma masiva muchas filas en la tabla y recuperar una matriz de ID. ¿Alguien sabe cómo puedo hacer esto?
Hay algunas preguntas similares, pero no son exactamente las mismas. No quiero insertar la nueva ID en ninguna tabla temporal; Solo quiero recuperar la matriz de IDs.
¿Puedo recuperar el lastInsertId de una inserción masiva?
Mysql mulitple row insertar-seleccionar declaración con last_insert_id ()
Creo que tendrá que manejar el ID de transacción en su aplicación, o el ID de artículo en su aplicación para hacer esto sin problemas.
Una forma de hacer esto que podría funcionar, asumiendo que todas sus inserciones son correctas (!), Es la siguiente:
A continuación, puede obtener las ID insertadas con un bucle para el número de filas afectadas, comenzando con lastid (que es la primera ID insertada de la inserción masiva). Y así, comprobé que funciona perfectamente ... solo tenga cuidado de que HeidiSQL, por ejemplo, no devuelva el valor correcto para ROW_COUNT (), probablemente porque es una interfaz gráfica de usuario malhumorada que hace una mierda al azar. línea de comandos o PHP mysqli -
START TRANSACTION;
BEGIN;
INSERT into test (b) VALUES (''1''),(''2''),(''3'');
SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount;
COMMIT;
En PHP parece que esto (local_sqle es una llamada directa a mysqli_query, local_sqlec es una llamada a mysqli_query + convertir el conjunto de resultados a la matriz de PHP):
local_sqle("START TRANSACTION;
BEGIN;
INSERT into test (b) VALUES (''1''),(''2''),(''3'');");
$r=local_sqlec("SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount;");
local_sqle("
COMMIT;");
$i=0;
echo "last id =".($r[0][''lastid''])."<br>";
echo "Row count =".($r[0][''rowcount''])."<br>";
while($i<$r[0][''rowcount'']){
echo "inserted id =".($r[0][''lastid'']+$i)."<br>";
$i++;
}
La razón por la que se separan las consultas es porque, de lo contrario, no obtendría mi resultado utilizando mis propias funciones. Si lo hace con las funciones estándar, puede volver a incluirlo en una declaración y luego recuperar el resultado que necesita (debe ser el número del resultado). 2: suponiendo que utilice una extensión que maneje más de un conjunto de resultados / consulta).
El hilo anterior, pero solo miró esto, así que aquí va: si está usando InnoDB en una versión reciente de MySQL, puede obtener la lista de ID usando LAST_INSERT_ID()
y ROW_COUNT()
.
InnoDB garantiza números secuenciales para INCREMENTO AUTOMÁTICO cuando se realizan inserciones masivas, siempre que innodb_autoinc_lock_mode
esté establecido en 0 (tradicional) o 1 (consecutivo). Por consiguiente, puede obtener el primer ID de LAST_INSERT_ID()
y el último agregando ROW_COUNT()-1
.
La única forma en que puedo pensar que se podría hacer es si almacena un identificador único para cada conjunto de filas insertadas (guid) y luego selecciona los identificadores de fila. p.ej:
INSERT INTO t1
(SELECT col1,col2,col3,''3aee88e2-a981-1027-a396-84f02afe7c70'' FROM a_very_large_table);
COMMIT;
SELECT id FROM t1
WHERE guid=''3aee88e2-a981-1027-a396-84f02afe7c70'';
También puedes generar el guid en la base de datos usando uuid()
Supongamos que tenemos una tabla llamada temptable con dos cols uid, col1 donde uid es un campo de incremento automático. Al hacer algo como a continuación, se devolverán todos los identificadores insertados en el conjunto de resultados. Puede recorrer el conjunto de resultados y obtener su ID. Me doy cuenta de que esta es una publicación antigua y que esta solución podría no funcionar en todos los casos. Pero para otros podría y es por eso que estoy respondiendo.
# lock the table
lock tables temptable write;
#bulk insert the rows;
insert into temptable(col1) values(1),(2),(3),(4);
#get the value of first inserted row. when bulk inserting last_insert_id() #should give the value of first inserted row from bulk op.
set @first_id = last_insert_id();
#now select the auto increment field whose value is greater than equal to #the first row. Remember since you have write lock on that table other #sessions can''t write to it. This resultset should have all the inserted #id''s
select uid from temptable where uid >=@first_id;
#now that you are done don''t forget to unlock the table.
unlock tables;
$query = "INSERT INTO TABLE (ID,NAME,EMAIL) VALUES (NULL,VALUE1, VALUE2)";
$idArray = array();
foreach($array as $key) {
mysql_query($query);
array_push($idArray, mysql_insert_id());
}
print_r($idArray);