2015-05-02 18 views
9

Recentemente mi sono imbattuto in un problema in cui dovevo essere in grado di prendere l'ultimo ID di una query che ho inserito in una pagina. Il processo è stato abbastanza semplice, ma mi piacerebbe avere una certa rassicurazione su come il processo è fatto. Ecco come il mio codice è:Quanto è efficiente Last_insert_id?

$query30 = $db->query("INSERT `mybb_quickexample` SET `player1` = '".$row19[username]."', `player2` = '".$row18[username]."', `games` = '".$numberofgames."'")or die(  mysqli_error()); 

Come potete vedere ho appena inserito qualcosa nel mybb_quickexample, che poi genera un ID. Ora nel codice direttamente sotto, cerco di individuare l'ID.

$mmid = $db->insert_id(); 

foreach($_POST['optiontitle'] as $val){ 
$val = $db->escape_string($val); // 
echo $val; 
$query30 = $db->query("INSERT `mybb_quickexample2` SET `gid` = '".$id."', `mid` = '".$mmid."', `optiontitle` = 'OPTION TITLE', `option1` = '$val'")or die(  mysqli_error()); 

} 

Come potete vedere, prende l'ID recente e lo inserisce nella nuova tabella. Permettendo a questi 2 tavoli di corrispondersi l'un l'altro più tardi quando ne ho bisogno.

Tuttavia, insert_last_id acquisisce l'ultima riga inserita nel database o l'ultima riga inserita nel database nella pagina? Ora non sono del tutto sicuro dei meccanismi alla base di questo, ma lo chiedo perché, e se una persona dovesse caricare questa pagina nello stesso momento in cui un'altra persona? Ci sarebbero ID ineguagliabili o il codice funzionerebbe ancora?

+0

Possibile duplicato di http://kera.name/articles/2011/08/one-less-bug-to-worry-about/ –

+0

@LightnessRacesinOrbit Questo non è un post stackoverflow. _Possibile duplicato_? – rpax

+0

@rpax:: whoosh: –

risposta

8

insert_last_id restituisce l'ultimo ID inserito della stessa sessione/connessione SQL (vedere MySQL manual). - Il server SQL non conosce le tue pagine. Finché la connessione/sessione non è condivisa non ci sono problemi (come le condizioni di gara).

E 'anche possibile ottenere l'ultimo inserito ID utilizzando SQL solo: select LAST_INSERT_ID(); o utilizzare direttamente in una seguente query SQL al fine di ridurre client-server di andata e ritorno come insert table B set foreign_id=LAST_INSERT_ID(),data="something"; (nota, tuttavia, se la seguente istruzione SQL anche ha una colonna di incremento automatico della prossima LAST_INSERT_ID() chiamata sarebbe tornato il nuovo ID inserito; vedi MySQL manual)

+0

Davvero? Non ho mai sentito parlare di insert_last_id prima di oggi – Strawberry

+3

È l'unico modo (senza bloccare una tabella) per ottenere l'ultimo ID inserito in modo thread-safe. – MrTux

1

Alcune librerie potrebbero recuperare last-insert-id automaticamente se si chiede loro o no, in questo caso chiamare è sempre sicuro (in quanto non v'è alcuna ulteriore richiesta contro il database).

Nel caso opposto restituisce l'ultimo ID della connessione. Se la connessione è condivisa, è meglio racchiuderla in una transazione.

6

Altri hanno sottolineato che LAST_INSERT_ID è gestito per connessione MySQL. Cattura l'ID effettivo utilizzato nell'inserimento più recente con un valore autoincrementato nella connessione. Cioè, fa la cosa giusta anche se anche altre connessioni fanno molti inserimenti. (Potrebbe essere vero su un sito Web occupato che serve più utenti contemporaneamente.)

Se è necessario utilizzarlo in un inserto, è possibile farlo direttamente senza alcuna sorta di andata e ritorno al cliente. Ad esempio, ecco due domande che potresti rilasciare una dopo l'altra dal tuo programma

INSERT INTO person (first, last) 
      VALUES ('Jack', 'Straw'); 

INSET INTO address (person_id, addr, town) 
      VALUES (LAST_INSERT_ID(),'10 Downing St', 'London'); 

Vedere come funziona? Puoi usarlo per fornire un valore in un elenco di valori inserto. È una delle cose più semplici ed efficienti di MySQL quando la usi in quel modo.