Salve,
Dopo la query di insert vorrei recuperare il valore id
auto incrementale che il database ha appena assegnato alla nuova riga appena inserita.
Salve,
Dopo la query di insert vorrei recuperare il valore id
auto incrementale che il database ha appena assegnato alla nuova riga appena inserita.
SELECT LAST_INSERT_ID();
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit
ciao,
se l'id e' autoincrementante puoi anche fare :
SELECT MAX(ID) FROM TABELLA ....
Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
Albert Einstein
Siate Affamati, siate Folli, siate Onesti e siate Generosi
Bomberdini, c'è una grossa differenza: LAST_INSERT_ID() è thread safe. Non c'è nessuna garanzia che, dopo che hai inserito un record ma prima che tu esegua quella query, non intervenga un altro inserimento da un altro thread. LAST_INSERT_ID() ti restituisce lo stesso l'ultimo valore inserito in questo threadOriginariamente inviato da bomberdini
se l'id e' autoincrementante puoi anche fare :
SELECT MAX(ID) FROM TABELLA ....![]()
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit
sisi LAST_INSERT_ID() su un programma multithread e' sicuramente piu' valido.
Non so se chi ha fatto la richiesta ha un programma multithread. Qualora avesse un unico processo gli ho dato un altra alternativa![]()
Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
Albert Einstein
Siate Affamati, siate Folli, siate Onesti e siate Generosi
Beh in genere qui fanno domande per applicazioni web...
Se poi vogliamo essere pignoli, LAST_INSERT_ID() è migliore perché non legge la tabella (nemmeno i metadati)... ma sto veramente esagerando, scusa la pignoleria![]()
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit
nessun problema.
La funzione LAST_INSERT_ID() invece come opera? mette un lock sulla tabella non permettendo altre transazioni?
Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
Albert Einstein
Siate Affamati, siate Folli, siate Onesti e siate Generosi
No nessun lock perché non accede alla tabella, semplicemente l'ultimo autoincrement che hai inserito rimane memorizzato in memoria, nelle variabili di sessione.
Ancora meglio, puoi chiamare la funzione mysql_insert_id() che è più veloce.
L'unico problema di LAST_INSERT_ID è che dentro le stored procedure ti dice l'ultimo id inserito PRIMA che iniziasse la stored procedure. Dopo la procedura invece torna a funzionare nel modo che ti aspetti. In pratica:
CREATE PROCEDURE xxx() ...
BEGIN
INSERT INTO t (id, ...) VALUES (2, ...);
SELECT LAST_INSERT_ID();
END;
INSERT INTO t (id, ...) VALUES (1, ...);
CALL xxx();
SELECT LAST_INSERT_ID();
...visualizza prima 1 e poi 2 (non due volte 2 come potresti pensare).
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit
Perche' dici che restituisce prima 1 e poi 2?
ce prima la insert di id = 2 e poi di id=1, quindi dovrebbe restituire 2 e poi 1.
Errore di battitura o mi sfugge qualcosa?
Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
Albert Einstein
Siate Affamati, siate Folli, siate Onesti e siate Generosi
In pratica il valore si aggiorna quando termina la procedura. Era questa la stranezza![]()
STK/Unit: Unit Test framework per MariaDB
http://stk.wikidot.com/stk-unit