web-dev-qa-db-fra.com

Obtenir la valeur actuelle de AUTO_INCREMENT pour n'importe quelle table

Comment obtenir la valeur actuelle de AUTO_INCREMENT pour une table dans MySQL?

262
bparise

Vous pouvez obtenir toutes les données de la table en utilisant cette requête:

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

Vous pouvez obtenir exactement cette information en utilisant cette requête:

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

Je crois que vous recherchez la fonction LAST_INSERT_ID () de MySQL. Si vous êtes dans la ligne de commande, exécutez simplement ce qui suit:

LAST_INSERT_ID();

Vous pouvez également obtenir cette valeur via une requête SELECT:

SELECT LAST_INSERT_ID();
19
jvdub

Si vous voulez juste connaître le numéro, plutôt que de l'obtenir dans une requête, vous pouvez utiliser:

SHOW CREATE TABLE tablename;

Vous devriez voir l'auto_increment en bas

15
johnnyjohnny

exemple de code exécutable 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;
?>  
4
Murat Başar

Même si la réponse de methai est correcte si vous exécutez la requête manuellement, un problème se produit lorsque 2 transactions/connexions simultanées exécutent réellement cette requête au moment de l'exécution en production (par exemple).

Juste essayé manuellement dans MySQL workbench avec 2 connexions ouvertes simultanément:

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

Transaction 1:

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

insert into translation (id) values (21);

Transaction 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;

L'insertion de la transaction 1 est ok: L'insertion de la transaction 2 est entachée d'une erreur: Code d'erreur: 1062. Entrée en double '21' pour la clé 'PRIMARY'.

Une bonne solution serait la réponse de jvdub car, par transaction/connexion, les 2 insertions seront:

Transaction 1:

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

Transaction 2:

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

# commit transaction 1;
# commit transaction 2;

Mais nous devons exécuter le last_insert_id () juste après l'insertion! Et nous pouvons réutiliser cet identifiant pour l'insérer dans d'autres tables où une clé étrangère est attendue!

De plus, nous ne pouvons pas exécuter les 2 requêtes comme suit:

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

parce que nous sommes intéressés à récupérer/réutiliser cet ID dans une autre table ou à revenir!

4
Davideas

Si column est incrémentation automatique sur le serveur SQL, consultez la valeur auto_increment actuelle. Si vous souhaitez modifier cette valeur pour cette colonne, utilisez la requête suivante.

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

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