2013-02-12 13 views
5

Sto utilizzando AUTO_INCREMENT e vorrei ottenere quell'ID della riga inserita in modo da poter aggiornare un'altra tabella utilizzando ID come campo comune tra le 2 tabelle.AUTO_INCREMENT e LAST_INSERT_ID

Ho capito che LAST_INSERT_ID otterrà l'ultimo ID. Tuttavia, la mia preoccupazione è che il database sia accessibile contemporaneamente da molti utenti. di conseguenza, potrebbe esserci un altro processo a cui è possibile accedere dalla tabella e anche inserire una nuova riga nello stesso momento.

LAST_INSERT_ID restituisce solo l'ultimo ID indipendentemente dalla connessione utilizzata o restituisce solo l'ultimo ID per la connessione che sto utilizzando?

Avviso, sto accedendo al database mySql utilizzando il pool di connessioni nel server tomcat.

MODIFICA: in estate, ho bisogno di inserire una riga nella Tabella A con incremento automatico, di quanto sia necessario inserire la riga nella tabella B, che deve essere collegata alla tabella A utilizzando il valore di incremento automatico.

+0

Si prega di fornire maggiori dettagli, quindi sarà utile rispondere. ma ancora puoi usare KeyHolder. – psi

risposta

10
SELECT max(employeeid) FROM Employee; 

La query sopra restituisce il valore di EmployeeID dell'ultimo record inserito nella tabella dei dipendenti, perché è una colonna EmployeeID incremento automatico. Questo sembra essere OK, ma supponiamo che due thread stiano eseguendo un'operazione di inserimento simultaneamente, c'è la possibilità che tu ottenga l'ID errato dell'ultimo record inserito! Non preoccuparti, MySQL fornisce una funzione che restituisce il valore della colonna di incremento automatico dell'ultimo record inserito.

SELECT LAST_INSERT_ID(); 

LAST_INSERT_ID() è sempre connessione specifica, ciò significa anche se un'operazione di inserimento viene eseguita simultaneamente da diverse connessioni, restituisce sempre il valore della specifica operazione connessione corrente. Quindi devi prima inserire record nella tabella Employee, eseguire la query sopra per ottenere il valore id e usarlo per inserire nella seconda tabella

+0

Grazie .. ho bisogno di utilizzare la transazione - setAutocommit (false) - in modo che LAST_INSERT_ID funzioni. o dovrebbe funzionare bene finché utilizzo la stessa connessione. – user836026

+0

@ user836026 per sicurezza, è possibile chiamare questo SET subito dopo INSERT, non importa se in una transazione o meno, quindi ancora una volta la menzione della transazione è più pertinente al caso MAX che è più probabile che produca il risultato desiderato se invocato all'interno di un transazione, tuttavia, LAST_INSERT_ID è favorito! – MediaVince

1

LAST_INSERT_ID restituisce l'ultimo ID di inserimento per la sessione corrente. Finché non si inserisce più di una voce con la connessione corrente, è valida.

Ulteriori informazioni qui: https://dba.stackexchange.com/questions/21181/is-mysqls-last-insert-id-function-guaranteed-to-be-correct

(i collegherebbe al mysql.com, ma è attualmente in giù per me)

+0

'LAST_INSERT_ID' è una chiamata globale? Non c'è 'LAST_INSERT_ID' per una tabella specifica? – user961627

+2

@ user961627 Si dovrebbe sempre sapere quale tabella è stata inserita per durare nella sessione corrente. – scones

2

LAST_INSERT_ID() lavoro nel contesto , dovrebbe essere nelle transazioni o all'interno Definito dall'utente memorizzata procedure o funzioni definite dall'utente.

+0

Grazie ... in Java, se ho utilizzato il commit automatico su false e il commit alter, dovrebbe fare il lavoro? – user836026

2

LAST_INSERT_ID è specifico del collegamento. È vero, ma si dovrebbe fare attenzione se si utilizza il pool di connessioni. Ciò può essere problematico quando si eseguono successive istruzioni INSERT IGNORE in un ciclo e il pool fornisce la stessa connessione a ogni iterazione.

Ad esempio; Si supponga che si riceve la stessa connessione (aperto) per ciascuna delle seguenti:

INSERT IGNORE ... some-new-id >>>LAST_INSERT_ID rendimenti 100

INSERT IGNORE ... some-existing-id >>>LAST_INSERT_ID restituisce ancora 100 (risultato dell'operazione precedente)

È sempre bene verificare se l'operazione INSERT ha effettivamente inserito delle righe prima di chiamare LAST_INSERT_ID.

Problemi correlati