Wie erhalte ich den aktuellen AUTO_INCREMENT-Wert für eine Tabelle in MySQL?
Antworten
Zu viele Anzeigen?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';
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();
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);
}
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;
?>
- See previous answers
- Weitere Antworten anzeigen