mysql - the - PDO-lastInsertId() para consulta de inserción múltiple
select last id mysql (9)
Puedo insertar 2 mascotas en una tabla, y obtener su lastInsertId () para su posterior procesamiento de a uno por vez (2 consultas).
Me pregunto si hay una forma de obtener dos lastInsertIds () y asignarlos a las variables si estoy insertando 2 filas en 1 consulta:
$query = "INSERT INTO pets (pet_name) VALUES ('':coco''),('':jojo'')";
$pet_insert = $dbh->prepare($query);
$pet_insert->execute(array('':coco'' => $coco,'':jojo'' => $jojo));
$New_PetID = $dbh->lastInsertId();
¿Es posible obtener el lastInsertId () para coco y para jojo? Entonces algo así como:
$New_PetID1 = $dbh->lastInsertId();//coco
$New_PetID2 = $dbh->lastInsertId();//jojo
Esto le dará la misma identificación, ¿alguna forma de obtener las 2 ID? Solo como referencia, esto está en un bloque de prueba.
¡Es posible! Todo lo que necesita hacer es llamar al método PDO lastInsertId (). Esto devolverá la primera identificación insertada al hacer INSERT múltiple o múltiple. A continuación, debemos realizar una operación de resta de suma simple con el número de filas afectadas por la última instrucción INSERT.
$firstInsertedId = $this->lastInsertId();
$InsertedIds = range($firstInsertedId, ($firstInsertedId + ($stmt->rowCount() - 1)) );
print_r($InsertedIds);
Bueno, como 1000 insertos es un poco más largo que 1 inserto, el tema sigue siendo interesante. La posible solución sería realizar 2 consultas. El primero es insertar 1000 filas y el segundo es seleccionarlas si hay algo único en esas filas insertadas. Por ejemplo con mascotas:
INSERT INTO pets ( name ) VALUES ( ''coco'', ''jojo'' );
SELECT id FROM pets WHERE name IN ( ''coco'', ''jojo'' );
Esto podría brindar beneficios solo para grandes conjuntos de datos.
La documentación indica: Returns the ID of the last inserted row or sequence value
Deberá realizar dos consultas para obtener la identificación para cada fila insertada.
Mi enfoque no resuelve este problema, sin embargo, puede ser útil para algunos casos similares.
Cuando necesito insertar una lista de filas grandes:
- Elimino
AUTO_INCREMENT
de la columna PrimaryKey, lo cambio a BIGINT. - Prepare una lista de valores exclusivos de PK utilizando la función
UUID_SHORT()
. Para crear una lista usando una sola consulta use:
( SELECT UUID_SHORT() ) UNION
( SELECT UUID_SHORT() ) UNION
( SELECT UUID_SHORT() ) # UNION (...
Insertar filas con esta lista PK preparada.
Este enfoque es especialmente conveniente cuando necesito insertar datos relacionados (por ejemplo, la lista PK preparada se usará al insertar las filas de la tabla de unión).
No es posible. Si necesita identificadores generados para ambas filas, debe realizar 2 INSERT
separados
Importante: si inserta varias filas con una sola instrucción INSERT, LAST_INSERT_ID () solo devuelve el valor generado para la primera fila insertada . La razón para esto es permitir reproducir fácilmente la misma instrucción INSERT contra otro servidor.
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id
Por favor, evite el tipo de soluciones dadas por Bruce. El valor de incremento automático se puede establecer para que sea diferente de 1. Por ejemplo, en el caso de la réplica de maestro a maestro. Hace un tiempo, un host donde se ejecuta una de nuestras aplicaciones cambió su configuración de db. Me di cuenta, por pura casualidad, que de repente la identificación se incrementó con dos en lugar de uno. Hubiéramos tenido un código como este que podría habernos causado serios problemas.
Traté de suponer que no es posible hasta que lo intenté por mi cuenta y pensé que ES POSIBLE .
Después de cada ejecución, agregue el lastInsertId () y asigne una clave.
Para mi ejemplo:
// First query
$sql = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth = $this->db->prepare($sql);
$sth->bindParam('':username'', $data[''username''], PDO::PARAM_STR);
$sth->bindParam('':email'', $data[''email''], PDO::PARAM_STR);
// Second Query
$sql2 = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth2 = $this->db->prepare($sql2);
$sth2->bindParam('':username'', $data[''username''], PDO::PARAM_STR);
$sth2->bindParam('':email'', $data[''email''], PDO::PARAM_STR);
// Start trans
$this->db->beginTransaction();
// Execute the two queries
$sth->execute();
$last[''ux1''] = $this->db->lastInsertId(); // <---- FIRST KEY
$sth2->execute();
$last[''ux2''] = $this->db->lastInsertId(); // <---- SECOND KEY
// Commit
$this->db->commit();
Y pude recuperar los dos últimos ID insertados
Array ([create] => Array ([ux1] => 117 [ux2] => 118)
)
Espero que esto ayude a otros que buscan la respuesta correcta.
puede agregar 1 a la última ID de inserción para obtener el último ID de registro real. Si inserta más de 2 registros simplemente agregue rowCount - 1 a last_insert_id.
Con innodb_autoinc_lock_mode establecido en 0 ("tradicional") o 1 ("consecutivos"), los valores de auto-incremento generados por cualquier declaración dada serán consecutivos, sin espacios, porque el bloqueo AUTO-INC a nivel de tabla se mantiene hasta el final de la declaración, y solo una de esas afirmaciones puede ejecutarse a la vez.
y
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 de AUTO_INCREMENT generado para la declaración más reciente que afecta a una columna AUTO_INCREMENT por ese cliente. Este valor no puede verse afectado por otros clientes, incluso si generan sus propios valores AUTO_INCREMENT. Este comportamiento garantiza que cada cliente pueda recuperar su propia ID sin preocuparse por la actividad de otros clientes, y sin la necesidad de bloqueos o transacciones.
para obtener más información, lea este documento http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html
puede usar ''multi_query ()'' agregue toda la consulta en una variable como: ''$ sql1 = "first insert";'' ''$ sql2 = "segundo inserto";'' ''$ sql3 = "tercer inserto";'' y así sucesivamente ... tome la cuenta de la cantidad de insertos que va a hacer. ahora ejecuta todas las consultas ''$ sql'' usando ''multi_query ()''. obtener la última identificación de inserción. ahora todo lo que tiene que hacer es ''$ rowno = $ lastinsertid - $ countofinserts''. así que básicamente obtendrás un número. agregue 1 a él y del número resultante al últimoinsertid son los id de inserción de las consultas de inserción que ejecutó