penso che si dovrà o gestire l'ID della transazione nella vostra applicazione, o l'id articolo nel vostro applicazione per farlo in modo impeccabile. (!)
Un modo per fare questo, che potrebbe funzionare, partendo dal presupposto che tutti i vostri inserti successo, è la seguente:
È quindi possibile ottenere l'ID inseriti di con un ciclo per il numero di righe interessate, a partire da lastid (che è il primo ID inserito dell'inserto di massa). E così, ho verificato che funziona perfettamente .. basta fare attenzione che HeidiSQL per esempio non restituirà il valore corretto per ROW_COUNT(), probabilmente perché è una schifosa interfaccia grafica che fa casuali merda noi non lo chiediamo - tuttavia è perfettamente corretto da o riga di comando 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;
In PHP sembra che questo (local_sqle è una chiamata direttamente al mysqli_query, local_sqlec è una chiamata a mysqli_query + conversione di risultati di array 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++;
}
Il motivo per cui le query sono separate è perché altrimenti non otterrei il mio risultato usando le mie funzioni, se lo sei Lo fai con le funzioni standard, puoi rimetterlo in una dichiarazione e poi recuperare il risultato che ti serve (dovrebbe essere il risultato numero 2 - assumendo che tu usi un'estensione che gestisce più di una serie di risultati/query).
fonte
2011-09-23 10:04:52
Perché non è possibile inserirli uno per uno? – sanmai
È necessario simulare la clausola 'OUTPUT'. Credo che si possa fare questo con un trigger in MySQL –
Non è possibile utilizzare l'inserimento di massa e quindi una funzione lime last_insert_id(), non funziona. –