Wie erhalte ich den aktuellen AUTO_INCREMENT-Wert für eine Tabelle in MySQL?
Wie erhalte ich den aktuellen AUTO_INCREMENT-Wert für eine Tabelle in MySQL?
Antworten:
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';
DATABASE()
anstelle des expliziten Datenbanknamens verwendet werden.
SELECT MAX(id) FROM table_name
?
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();
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
1
.
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!
last_insert_id()
AUTO_INCREMENT
Wert abgerufen werden soll.
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;
?>
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")
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;
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.