372 Stimmen

Holen Sie sich den aktuellen AUTO_INCREMENT-Wert für eine beliebige Tabelle

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

701voto

methai Punkte 8355

Sie können alle Tabellendaten abrufen, indem Sie diese Abfrage verwenden:

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

Sie können genau diese Informationen abrufen, indem Sie diese Abfrage verwenden:

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

34voto

johnnyjohnny Punkte 341

Wenn Sie nur die Nummer wissen möchten, anstatt sie abzufragen, verwenden Sie:

SHOW CREATE TABLE Tabellenname;

Sie sollten das auto_increment am Ende sehen

22voto

jvdub Punkte 891

Ich glaube, du suchst nach der LAST_INSERT_ID() Funktion von MySQL. Wenn du sie in der Befehlszeile verwenden möchtest, führe einfach folgendes aus:

LAST_INSERT_ID();

Du könntest diesen Wert auch über eine SELECT-Abfrage erhalten:

SELECT LAST_INSERT_ID();

10voto

Davideas Punkte 3057

Auch wenn die Antwort von methai richtig 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).

Habe gerade manuell im MySQL Workbench mit 2 gleichzeitig geöffneten Verbindungen versucht:

CREATE TABLE translation (
  id BIGINT PRIMARY KEY AUTO_INCREMENT
);
# Nehmen wir an, wir haben bereits 20 Einträge, wir führen 2 neue Einfügungen aus:

Transaktion 1:

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

insert into translation (id) values (21);

Transaktion 2:

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

insert into translation (id) values (21);

# Transaktion 1 bestätigen;
# Transaktion 2 bestätigen;
  • Einfügung von Transaktion 1 ist in Ordnung
  • Einfügung von Transaktion 2 führt zu einem Fehler: Fehlercode: 1062. Duplikateintrag '21' für Schlüssel 'PRIMARY'.

Ein guter Lösungsansatz wäre die Antwort von jvdub, weil pro Transaktion/Verbindung die 2 Einfügungen wie folgt wären:

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();

# Transaktion 1 bestätigen;
# Transaktion 2 bestätigen;

Aber wir müssen das last_insert_id() direkt nach der Einfügung ausführen! Und wir können diese ID wiederverwenden, um sie in anderen Tabellen einzufügen, wo ein Fremdschlüssel erwartet wird!

Außerdem können wir die 2 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 greifen/wiederverwenden oder zurückzugeben!

BEARBEITEN: 02.08.2021, Abrufen des Werts

Um den Wert tatsächlich in der Anwendung abzurufen (Beispiel in Java mit MyBatis):

@Mapper
public interface ClientMapper {
    @Select("select last_insert_id()")
    Long getLastInsertedId();

    @Insert({...})
    void insertClientInfo(ClientInfo client);
}

Und dann im Repository:

public void insertClientInfo(ClientInfo clientInfo) {
    mapper.insertClientInfo(clientInfo);
    Long pk = mapper.getLastInsertedId();
    clientInfo.setId(pk);
}

5voto

Murat Başar Punkte 69

mysqli ausführlicher Beispielcode:

connect_errno) die ($db->connect_error);

    $tabelle=$db->prepare("SHOW TABLE STATUS FROM IhreDatenbankName");
    $tabelle->execute();
    $ergebnis = $tabelle->get_result();
    while ($zeile=$ergebnis->fetch_assoc()){
        if ($zeile["Name"]== "IhrTabellenName"){
            $ai[$zeile["Name"]]=$zeile["Auto_increment"];
        }
    }
    $LetztesAutoIncrement=$ai["IhrTabellenName"];
    echo $LetztesAutoIncrement;
?>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X