Come ottengo il valore AUTO_INCREMENT corrente per una tabella in MySQL?Ottieni il valore AUTO_INCREMENT corrente per qualsiasi tabella
risposta
È 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';
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();
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
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
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
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
Questo non sembra funzionare se la tua tabella non ha righe e auto_increment è a '1'. – Pacerier
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;
?>
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")
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!
Buona spiegazione! Grazie. Ora è chiaro il motivo per cui vorremmo usare 'last_insert_id()' – Imtiaz
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