2013-04-04 7 views
190

Come ottengo il valore AUTO_INCREMENT corrente per una tabella in MySQL?Ottieni il valore AUTO_INCREMENT corrente per qualsiasi tabella

+26

Questa domanda non è necessariamente un duplicato. La domanda collegata richiede il conteggio delle righe e la risposta accettata SOLO ottiene il conteggio delle righe, NON AUTO_INCREMENT, che è una domanda completamente diversa. – methai

risposta

396

È possibile ottenere tutti i dati della tabella utilizzando questa query:

SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ; 

è possibile ottenere esattamente queste informazioni utilizzando questa query:

SELECT `AUTO_INCREMENT` 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'DatabaseName' 
AND TABLE_NAME = 'TableName'; 
+4

Wow, illuminazione veloce !! Grazie!! +2 punti – bparise

+22

Può anche usare 'DATABASE()' al posto del nome del database esplicito. – Mido

+18

Nota: DATABASE() è NULL se non è stato emesso un comando USE * DATABASE * – methai

19

Ti credo stia cercando per MySQL Funzione LAST_INSERT_ID(). Se nella riga di comando, è sufficiente eseguire il seguente:

LAST_INSERT_ID(); 

Si potrebbe anche ottenere questo valore tramite una query SELECT:

SELECT LAST_INSERT_ID(); 
+0

Non è la migliore idea aggiungerne uno e aspettarsi, sarà l'ID della riga successiva. Nel frattempo un'altra transazione potrebbe inserire una nuova riga e useresti l'ID sbagliato giusto? – agim

+0

Hai ragione. Immagino che dipenda dall'ambiente in cui stai correndo. Se si tratta di un ambiente di test controllato, è probabile che tu possa aggiungerne uno ed essere sicuro. La migliore risposta è stata fornita da Methai. – jvdub

+2

Qual è la risposta migliore, dipende da ciò che si desidera raggiungere. Se si inserisce una nuova riga e si desidera conoscere l'ID creato, la risposta è la migliore, poiché LAST_INSERT_ID() è sicuro per le transazioni e garantisce che si ottiene l'ID per l'oggetto creato. Ho votato la tua risposta ma eliminerei la parte con 'aggiungi uno ad esso ...' – agim

10

Se si desidera solo conoscere il numero, piuttosto che farlo in una query allora si può usare:

SHOW CREATE TABLE tablename; 

si dovrebbe vedere l'AUTO_INCREMENT in fondo

+4

Questo non sembra funzionare se la tua tabella non ha righe e auto_increment è a '1'. – Pacerier

3

codice di esempio eseguibile mysqli:

<?php 
     $db = new mysqli("localhost", "user", "password", "YourDatabaseName"); 
     if ($db->connect_errno) die ($db->connect_error); 

     $table=$db->prepare("SHOW TABLE STATUS FROM YourDatabaseName"); 
     $table->execute(); 
     $sonuc = $table->get_result(); 
      while ($satir=$sonuc->fetch_assoc()){ 
       if ($satir["Name"]== "YourTableName"){ 
        $ai[$satir["Name"]]=$satir["Auto_increment"]; 
       } 
      } 
     $LastAutoIncrement=$ai["YourTableName"]; 
     echo $LastAutoIncrement; 
    ?> 
1

Se la colonna è autoincremented in SQL Server poi a vedere il valore autoincremented corrente, e se si desidera modificare tale valore per quella colonna utilizzare la seguente query.

-- to get current value 
 
select ident_current('Table_Name') 
 

 
-- to update current value 
 
dbcc checkident ('[Table_Name]',reseed,"Your Value")

3

Nonostante il methai 's risposta è corretta se si esegue manualmente la query, il problema si verifica quando 2 concorrenti di transazione/connessioni in realtà eseguire questa query in fase di esecuzione della produzione (per esempio).

Appena provato manualmente MySQL banco con 2 connessioni aperte simultaneamente:

CREATE TABLE translation (
    id BIGINT PRIMARY KEY AUTO_INCREMENT 
); 
# Suppose we have already 20 entries, we execute 2 new inserts: 

Transazione 1:

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation'; 

insert into translation (id) values (21); 

Transazione 2:

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation'; 

insert into translation (id) values (21); 

# commit transaction 1; 
# commit transaction 2; 

inserimento o f La transazione 1 è ok: L'inserimento della transazione 2 va in errore: Codice di errore: 1062. Voce duplicata '21' per la chiave 'PRIMARY'.

Una buona soluzione sarebbe jvdub 's risposta perché per transazione/collegamento i 2 inserti saranno:

Operazione 1:

insert into translation (id) values (null); 
21 = SELECT LAST_INSERT_ID(); 

transazione 2:

insert into translation (id) values (null); 
22 = SELECT LAST_INSERT_ID(); 

# commit transaction 1; 
# commit transaction 2; 

Ma noi abbiamo t o eseguire lo last_insert_id() subito dopo l'inserimento! E possiamo riutilizzare quell'ID per essere inseriti in altre tabelle dove è prevista una chiave esterna!

Inoltre, non siamo in grado di eseguire le query 2 come segue:

insert into translation (id) values ((SELECT AUTO_INCREMENT FROM 
    information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() 
    AND TABLE_NAME='translation')); 

perché siamo in realtà interessati ad afferrare/riutilizzare tale ID in altra tabella o per tornare!

+1

Buona spiegazione! Grazie. Ora è chiaro il motivo per cui vorremmo usare 'last_insert_id()' – Imtiaz