creo que tendrá que o bien manejar la identificación de la transacción en su aplicación, o el ID de elemento en su aplicación para hacer esto sin problemas. (!)
Una manera de hacer esto que podría trabajar, asumiendo que todas sus inserciones tengan éxito, es el siguiente:
A continuación, puede obtener los insertos de identificación con un lazo para el número de filas afectadas, a partir de lastid (que es la primera identificación insertada de la inserción masiva). Y por lo tanto, comprobé que funciona perfectamente ... solo tenga cuidado de que HeidiSQL, por ejemplo, no devuelva el valor correcto para ROW_COUNT(), probablemente porque es una mala GUI haciendo mierda al azar, no se lo pedimos, sin embargo es perfectamente correcto de ya sea línea de comandos o mysqli PHP -
START TRANSACTION;
BEGIN;
INSERT into test (b) VALUES ('1'),('2'),('3');
SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount;
COMMIT;
En PHP que tiene este aspecto (local_sqle es una llamada directamente a mysqli_query, local_sqlec es una llamada a mysqli_query + convertir conjunto de resultados de matriz 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 cual las consultas están separadas es porque de lo contrario no obtendría mi resultado usando mis propias funciones, si Haga esto con funciones estándar, puede volver a colocarlo en una declaración y luego recuperar el resultado que necesita (debe ser el resultado número 2, suponiendo que utilice una extensión que maneje más de un conjunto de resultados/consulta).
¿Por qué no puede insertarlos uno por uno? – sanmai
Necesita simular la cláusula 'OUTPUT'. Creo que puedes hacer esto con un disparador en MySQL –
No puedes usar la inserción masiva y luego una función lime last_insert_id(), no funciona. –