Ruft den aktuellen AUTO_INCREMENT-Wert für eine beliebige Tabelle ab

294

Wie erhalte ich den aktuellen AUTO_INCREMENT-Wert für eine Tabelle in MySQL?

bparise
quelle
31
Diese Frage ist nicht unbedingt ein Duplikat. Die verknüpfte Frage fragt nach der Zeilenanzahl und die akzeptierte Antwort erhält NUR die Zeilenanzahl, NICHT AUTO_INCREMENT - was eine ganz andere Frage ist.
Methai

Antworten:

569

Mit dieser Abfrage können Sie alle Tabellendaten abrufen:

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

Mit dieser Abfrage können Sie genau diese Informationen abrufen:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';
Methai
quelle
34
Kann auch DATABASE()anstelle des expliziten Datenbanknamens verwendet werden.
M. Suleiman
22
Hinweis: DATABASE () ist NULL, wenn Sie keinen USE DATABASE- Befehl ausgegeben haben
Methai
5
Gibt es einen Grund, warum du nicht kannst SELECT MAX(id) FROM table_name?
Brian
43
Was ist, wenn Sie den letzten Datensatz gelöscht haben? max gibt dir nicht das aktuelle auto_increment
peterpeterson
3
Gibt dies den neuesten AUTO_INCREMENT-Wert in der Tabelle an oder wie hoch der nächste Wert sein wird?
Sidx
18

Ich glaube, Sie suchen nach der LAST_INSERT_ID () -Funktion von MySQL . Wenn Sie sich in der Befehlszeile befinden, führen Sie einfach Folgendes aus:

LAST_INSERT_ID();

Sie können diesen Wert auch über eine SELECT-Abfrage erhalten:

SELECT LAST_INSERT_ID();
jvdub
quelle
3
Es ist nicht die beste Idee, eine hinzuzufügen und zu erwarten, dass dies die ID der nächsten Zeile ist. In der Zwischenzeit könnte eine andere Transaktion eine neue Zeile einfügen und Sie würden die falsche ID verwenden, oder?
Agim
Du hast recht. Ich denke, es hängt von der Umgebung ab, in der Sie ausgeführt werden. Wenn es sich um eine kontrollierte Testumgebung handelt, können Sie höchstwahrscheinlich eine hinzufügen und sicher sein. Die beste Antwort lieferte Methai.
Jvdub
2
Was die beste Antwort ist, hängt davon ab, was Sie erreichen möchten. Wenn Sie eine neue Zeile einfügen und die erstellte ID wissen möchten, ist Ihre Antwort die beste Antwort, da LAST_INSERT_ID () transaktionssicher ist und sicherstellt, dass Sie die ID für das erstellte Objekt erhalten. Ich habe über Ihre Antwort abgestimmt, aber ich würde den Teil mit "Hinzufügen ..."
löschen
25
LAST_INSERT_ID () ist pro Verbindung. Das heißt, wenn ein anderer Prozess drei zusätzliche Zeilen nach Ihnen einfügt, unterscheidet sich IHR Aufruf LAST_INSERT_ID () von ihrem. Diese Frage fragt nach dem aktuellen AUTO_INC-Wert in der Tabelle selbst.
Methai
2
Wenn die letzte INSERT-Anweisung mehr als eine Zeile eingefügt hat, erhalten Sie die falsche Antwort. MySQL-Dokumentation (Hervorhebung hinzugefügt): "LAST_INSERT_ID () gibt einen 64-Bit-Wert zurück, der den ersten automatisch generierten Wert darstellt, der als Ergebnis der zuletzt ausgeführten INSERT-Anweisung erfolgreich für eine AUTO_INCREMENT-Spalte eingefügt wurde." Intuitiv! dev.mysql.com/doc/refman/5.6/en/…
Charlie
15

Wenn Sie nur die Nummer wissen möchten, anstatt sie in einer Abfrage zu erhalten, können Sie Folgendes verwenden:

SHOW CREATE TABLE tablename;

Sie sollten das auto_increment unten sehen

Johnnyjohnny
quelle
5
Dies scheint nicht zu funktionieren, wenn Ihre Tabelle keine Zeilen enthält und auto_increment aktiviert ist 1.
Pacerier
6

Obwohl die Antwort von methai korrekt ist, wenn Sie die Abfrage manuell ausführen, tritt ein Problem auf, wenn 2 gleichzeitige Transaktionen / Verbindungen diese Abfrage tatsächlich zur Laufzeit in der Produktion ausführen (zum Beispiel).

Nur manuell in der MySQL Workbench mit 2 gleichzeitig geöffneten Verbindungen versucht:

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

Transaktion 1:

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

insert into translation (id) values (21);

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

Das Einfügen von Transaktion 1 ist in Ordnung: Das Einfügen von Transaktion 2 ist fehlerhaft: Fehlercode: 1062. Doppelter Eintrag '21' für Schlüssel 'PRIMARY'.

Eine gute Lösung wäre die Antwort von jvdub , da pro Transaktion / Verbindung die 2 Einfügungen lauten:

Transaktion 1:

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

Transaktion 2:

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

# commit transaction 1;
# commit transaction 2;

Aber wir müssen die last_insert_id () direkt nach dem Einfügen ausführen ! Und wir können diese ID wiederverwenden, um sie in andere Tabellen einzufügen, in denen ein Fremdschlüssel erwartet wird!

Außerdem können wir die beiden Abfragen nicht wie folgt ausführen:

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

weil wir tatsächlich daran interessiert sind, diese ID in einer anderen Tabelle zu erfassen / wiederzuverwenden oder zurückzukehren!

Davideas
quelle
2
Gute Erklärung! Vielen Dank. Es ist jetzt klar, warum wir verwenden wollenlast_insert_id()
Imtiaz
Dies ist ein interessantes Szenario, aber ich glaube nicht, dass es tatsächlich die Frage beantwortet, wie der AUTO_INCREMENTWert abgerufen werden soll.
Sharlike
4

ausführbarer Beispielcode für 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
quelle
1

Wenn die Spalte in SQL Server automatisch inkrementiert wird, verwenden Sie die folgende Abfrage, um den aktuellen automatisch inkrementierten Wert anzuzeigen, und wenn Sie diesen Wert für diese Spalte bearbeiten möchten.

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

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

Abfrage zur Überprüfung der prozentualen "Verwendung" von AUTO_INCREMENT für alle Tabellen eines bestimmten Schemas (außer Spalten mit dem Typ bigint ohne Vorzeichen ):

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
quelle
0

Ich habe nach dem gleichen gesucht und schließlich eine statische Methode in einer Helper-Klasse erstellt (in meinem Fall habe ich sie App \ Helpers \ Database genannt).

Die Methode

/**
 * 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;
}

Um die Methode aufzurufen und MySql AUTO_INCREMENT abzurufen, verwenden Sie einfach Folgendes:

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

Ich hoffe es hilft.

McRui
quelle