Obter o valor AUTO_INCREMENT atual para qualquer tabela


294

Como obtenho o valor AUTO_INCREMENT atual para uma tabela no MySQL?


31
Esta questão não é necessariamente uma duplicata. A pergunta vinculada está solicitando a contagem de linhas e a resposta aceita SOMENTE obtém a contagem de linhas, NÃO AUTO_INCREMENT - que é uma pergunta totalmente diferente.
methai

Respostas:


569

Você pode obter todos os dados da tabela usando esta consulta:

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

Você pode obter exatamente essas informações usando esta consulta:

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

34
Também pode usar o DATABASE()nome do banco de dados explícito.
M. Suleiman

22
Nota: DATABASE () é NULL se você não tiver emitido um USE DATABASE comando
methai

5
Existe uma razão para você não poder SELECT MAX(id) FROM table_name?
Brian

43
e se você excluiu o último registro? Max não lhe dará o auto_increment atual
peterpeterson

3
Isso fornece o valor AUTO_INCREMENT mais recente da tabela ou qual será o valor nnext seguinte?
Sidx 19/08

18

Eu acredito que você está procurando pela função LAST_INSERT_ID () do MySQL . Se estiver na linha de comando, basta executar o seguinte:

LAST_INSERT_ID();

Você também pode obter esse valor através de uma consulta SELECT:

SELECT LAST_INSERT_ID();

3
Não é a melhor ideia adicionar um a ele e esperar, será o ID da próxima linha. Enquanto isso, outra transação poderia inserir uma nova linha e você usaria o ID errado, certo?
agim

Você está certo. Eu acho que depende do ambiente em que você está rodando. Se for um ambiente de teste controlado, você provavelmente poderá adicionar um e estar seguro. A melhor resposta foi fornecida por methai.
jvdub

2
Qual é a melhor resposta, depende do que você deseja alcançar. Se você inserir uma nova linha e desejar conhecer o ID criado, sua resposta será a melhor, pois LAST_INSERT_ID () é seguro para transações e garante que você obtenha o ID do objeto criado. Votei a sua resposta, mas eu iria apagar a parte com 'adicionar um a ele ...'
agim

25
LAST_INSERT_ID () é por conexão. Isso significa que, se outro processo inserir três linhas adicionais depois de você, a chamada YOUR LAST_INSERT_ID () será diferente da deles. Esta pergunta está solicitando o atual valor AUTO_INC na própria tabela.
methai

2
Se a última instrução INSERT inseriu mais de uma linha, isso fornecerá a resposta errada. Documentação do MySQL (ênfase adicionada): "LAST_INSERT_ID () retorna um valor de 64 bits que representa o primeiro valor gerado automaticamente inserido com êxito para uma coluna AUTO_INCREMENT como resultado da instrução INSERT executada mais recentemente." Intuitivo! dev.mysql.com/doc/refman/5.6/en/…
Charlie

15

Se você apenas deseja saber o número, em vez de obtê-lo em uma consulta, pode usar:

SHOW CREATE TABLE tablename;

Você deve ver o incremento automático na parte inferior


5
Isso não parece funcionar se sua tabela não possui linhas e o incremento automático está em 1.
Pacerier 23/02

6

Embora a resposta de methai esteja correta se você executar manualmente a consulta, ocorre um problema quando duas transações / conexões simultâneas realmente executam essa consulta em tempo de execução na produção (por exemplo).

Apenas tentei manualmente no MySQL workbench com 2 conexões abertas simultaneamente:

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

Transação 1:

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

insert into translation (id) values (21);

Transação 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;

A inserção da transação 1 está correta: a inserção da transação 2 está com erro: Código do erro: 1062. Entrada duplicada '21' para a chave 'PRIMARY'.

Uma boa solução seria a resposta do jvdub porque, por transação / conexão, as 2 inserções serão:

Transação 1:

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

Transação 2:

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

# commit transaction 1;
# commit transaction 2;

Mas temos que executar o last_insert_id () logo após a inserção! E podemos reutilizar esse ID para ser inserido em outras tabelas onde uma chave estrangeira é esperada!

Além disso, não podemos executar as 2 consultas da seguinte maneira:

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

porque realmente estamos interessados ​​em pegar / reutilizar esse ID em outra tabela ou retornar!


2
Boa explicação! obrigado. É agora claro por que nós queremos usarlast_insert_id()
Imtiaz

Esse é um cenário interessante, mas não acho que ele realmente responda à pergunta que é recuperar o AUTO_INCREMENTvalor.
Sharlike

4

código de exemplo executável do 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 a coluna for incrementada automaticamente no servidor sql, para ver o valor atual incrementado automaticamente, e se você deseja editar esse valor para essa coluna, use a consulta a seguir.

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

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

1

Consulta para verificar a porcentagem de "uso" de AUTO_INCREMENT para todas as tabelas de um determinado esquema (exceto colunas com o tipo bigint não assinado ):

SELECT 
  c.TABLE_NAME,
  c.COLUMN_TYPE,
  c.MAX_VALUE,
  t.AUTO_INCREMENT,
  IF (c.MAX_VALUE > 0, ROUND(100 * t.AUTO_INCREMENT / c.MAX_VALUE, 2), -1) AS "Usage (%)" 
FROM 
  (SELECT 
     TABLE_SCHEMA,
     TABLE_NAME,
     COLUMN_TYPE,
     CASE 
        WHEN COLUMN_TYPE LIKE 'tinyint(1)' THEN 127
        WHEN COLUMN_TYPE LIKE 'tinyint(1) unsigned' THEN 255
        WHEN COLUMN_TYPE LIKE 'smallint(%)' THEN 32767
        WHEN COLUMN_TYPE LIKE 'smallint(%) unsigned' THEN 65535
        WHEN COLUMN_TYPE LIKE 'mediumint(%)' THEN 8388607
        WHEN COLUMN_TYPE LIKE 'mediumint(%) unsigned' THEN 16777215
        WHEN COLUMN_TYPE LIKE 'int(%)' THEN 2147483647
        WHEN COLUMN_TYPE LIKE 'int(%) unsigned' THEN 4294967295
        WHEN COLUMN_TYPE LIKE 'bigint(%)' THEN 9223372036854775807
        WHEN COLUMN_TYPE LIKE 'bigint(%) unsigned' THEN 0
        ELSE 0
     END AS "MAX_VALUE" 
   FROM 
     INFORMATION_SCHEMA.COLUMNS
     WHERE EXTRA LIKE '%auto_increment%'
   ) c

   JOIN INFORMATION_SCHEMA.TABLES t ON (t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME)

WHERE
 c.TABLE_SCHEMA = 'YOUR_SCHEMA' 
ORDER BY
 `Usage (%)` DESC;

0

Eu estava procurando o mesmo e acabei criando um método estático dentro de uma classe Helper (no meu caso, chamei-o de App \ Helpers \ Database).

O método

/**
 * Method to get the autoincrement value from a database table
 *
 * @access public
 *
 * @param string $database The database name or configuration in the .env file
 * @param string $table    The table name
 *
 * @return mixed
 */
public static function getAutoIncrementValue($database, $table)
{
    $database ?? env('DB_DATABASE');

    return \DB::select("
        SELECT AUTO_INCREMENT 
        FROM information_schema.TABLES 
        WHERE TABLE_SCHEMA = '" . env('DB_DATABASE') . "' 
        AND TABLE_NAME = '" . $table . "'"
    )[0]->AUTO_INCREMENT;
}

Para chamar o método e obter o MySql AUTO_INCREMENT, use o seguinte:

$auto_increment = \App\Helpers\Database::getAutoIncrementValue(env('DB_DATABASE'), 'your_table_name');

Espero que ajude.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.