Obtenga el valor actual de AUTO_INCREMENT para cualquier tabla

294

¿Cómo obtengo el valor actual de AUTO_INCREMENT para una tabla en MySQL?

bparise
fuente
31
Esta pregunta no es necesariamente un duplicado. La pregunta vinculada es el recuento de filas, y la respuesta aceptada SOLO obtiene el recuento de filas, NO AUTO_INCREMENT, que es una pregunta completamente diferente.
methai

Respuestas:

569

Puede obtener todos los datos de la tabla utilizando esta consulta:

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

Puede obtener exactamente esta información utilizando esta consulta:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';
methai
fuente
34
También se puede usar en DATABASE()lugar del nombre explícito de la base de datos.
M. Suleiman
22
Nota: DATABASE () es NULL si no ha emitido un comando USE DATABASE
methai
55
¿Hay alguna razón por la que no puedes SELECT MAX(id) FROM table_name?
Brian
43
¿Qué pasa si eliminó el último registro? max no le dará el auto_increment actual
peterpeterson
3
¿Esto proporciona el último valor AUTO_INCREMENT en la tabla o cuál será el valor siguiente?
sidx
18

Creo que estás buscando la función LAST_INSERT_ID () de MySQL . Si está en la línea de comando, simplemente ejecute lo siguiente:

LAST_INSERT_ID();

También puede obtener este valor a través de una consulta SELECT:

SELECT LAST_INSERT_ID();
jvdub
fuente
3
No es la mejor idea agregarle uno y esperar, será la ID de la siguiente fila. Mientras tanto, otra transacción podría insertar una nueva fila y usaría la ID incorrecta ¿verdad?
Agim
Tienes razón. Supongo que depende del entorno en el que se esté ejecutando. Si se trata de un entorno de prueba controlado, lo más probable es que pueda agregar uno y estar seguro. La mejor respuesta fue proporcionada por methai.
jvdub
2
La mejor respuesta depende de lo que quieras lograr. Si inserta una nueva fila y desea conocer la ID creada, entonces su respuesta es la mejor respuesta, ya que LAST_INSERT_ID () es segura para las transacciones y garantiza que obtenga la ID para el objeto creado. He votado su respuesta, pero eliminaría la parte con 'agregar uno ...'
agim
25
LAST_INSERT_ID () es por conexión. Eso significa que si otro proceso inserta tres filas adicionales después de usted, su llamada LAST_INSERT_ID () será diferente a la de ellos. Esta pregunta solicita el valor actual de AUTO_INC en la tabla misma.
methai 05 de
2
Si la última instrucción INSERT insertó más de una fila, esto le dará la respuesta incorrecta. Documentación de MySQL (énfasis agregado): "LAST_INSERT_ID () devuelve un valor de 64 bits que representa el primer valor generado automáticamente insertado con éxito para una columna AUTO_INCREMENT como resultado de la instrucción INSERT ejecutada más recientemente". ¡Intuitivo! dev.mysql.com/doc/refman/5.6/en/…
Charlie
15

Si solo desea conocer el número, en lugar de obtenerlo en una consulta, puede usar:

SHOW CREATE TABLE tablename;

Debería ver el aumento automático en la parte inferior

johnnyjohnny
fuente
55
Esto no parece funcionar si su tabla no tiene filas y auto_increment está en 1.
Pacerier
6

Aunque la respuesta de methai es correcta si ejecuta manualmente la consulta, se produce un problema cuando 2 transacciones / conexiones concurrentes realmente ejecutan esta consulta en tiempo de ejecución en producción (por ejemplo).

Intenté manualmente en MySQL workbench con 2 conexiones abiertas simultáneamente:

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

Transacción 1:

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

insert into translation (id) values (21);

Transacción 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;

La inserción de la transacción 1 está bien: la inserción de la transacción 2 presenta un error: Código de error: 1062. Duplicar la entrada '21' para la clave 'PRIMARIO'.

Una buena solución sería la respuesta de jvdub porque por transacción / conexión los 2 insertos serán:

Transacción 1:

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

Transacción 2:

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

# commit transaction 1;
# commit transaction 2;

¡Pero tenemos que ejecutar last_insert_id () justo después de la inserción! ¡Y podemos reutilizar esa identificación para insertarla en otras tablas donde se espera una clave foránea!

Además, no podemos ejecutar las 2 consultas de la siguiente manera:

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

¡porque en realidad estamos interesados ​​en obtener / reutilizar esa ID en otra tabla o regresar!

Davideas
fuente
2
¡Buena explicación! Gracias. Ahora está claro por qué last_insert_id()
querríamos
Este es un escenario interesante, pero no creo que realmente responda la pregunta que es recuperar el AUTO_INCREMENTvalor.
Sharlike
4

código de muestra ejecutable de 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;
?>  
Murat Başar
fuente
1

Si la columna se autoincrementa en el servidor SQL, para ver el valor autoincrementado actual, y si desea editar ese valor para esa columna, use la siguiente consulta.

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

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

Consulta para verificar el porcentaje de "uso" de AUTO_INCREMENT para todas las tablas de un esquema dado (excepto columnas con tipo bigint sin signo ):

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;
Jiří Chmiel
fuente
0

Estaba buscando lo mismo y terminé creando un método estático dentro de una clase Helper (en mi caso, lo llamé App \ Helpers \ Database).

El 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 llamar al método y obtener el MySQL AUTO_INCREMENT simplemente use lo siguiente:

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

Espero eso ayude.

McRui
fuente