Obtenir la valeur D'incrément automatique actuelle pour n'importe quelle table

Comment puis-je obtenir la valeur AUTO_INCREMENT actuelle pour une table dans MySQL?

223
demandé sur Andrew Medico 2013-04-05 00:55:27

6 réponses

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';
452
répondu methai 2016-08-01 05:46:41

Je crois que vous recherchez la fonction Last_insert_id() de MySQL. Si 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
répondu jvdub 2013-04-04 22:50:48

Si vous voulez simplement savoir le nombre, plutôt que de le faire dans une requête, vous pouvez utiliser:

SHOW CREATE TABLE tablename;

Vous devriez voir l'auto_increment en bas

12
répondu johnnyjohnny 2015-01-16 09:33:20

Malgré la réponse de methai est correcte Si vous exécutez manuellement la requête, le 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: Insertion de la transaction 2 va en erreur: Code D'erreur: 1062. Dupliquer l'entrée " 21 "pour la clé "primaire".

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 avons à exécuter le last_insert_id(), juste après l'insertion! Et nous pouvons réutiliser id pour être inséré dans d'autres tables où une clé étrangère est prévu!

Aussi, nous ne pouvons pas exécuter les 2 requêtes suivant:

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

Parce que nous sommes réellement intéressés à saisir / réutiliser cet ID dans une autre table ou à retourner!

4
répondu Davidea 2017-08-20 21:31:03

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;
    ?>  
3
répondu Murat Başar 2015-05-05 17:02:08

Si la colonne est auto-incrémentée dans sql server, alors pour voir la valeur auto-incrémentée actuelle, et si vous voulez 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
répondu Mukul 2017-08-04 14:27:34