Получить текущее значение auto INCREMENT для любой таблицы
Как получить текущее значение AUTO_INCREMENT для таблицы в MySQL?
6 ответов
Вы можете получить все данные таблицы с помощью запроса:
SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ;
вы можете получить именно эту информацию, используя этот запрос:
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND TABLE_NAME = 'TableName';
Если вы просто хотите узнать номер, а не получить его в запросе, вы можете использовать:
SHOW CREATE TABLE tablename;
вы должны увидеть auto_increment внизу
несмотря на methaiправильный ответ если вы вручную запустите запрос, проблема возникает, когда 2 параллельные транзакции/соединения фактически выполняют этот запрос во время выполнения в производстве (например).
просто попробовал вручную в MySQL workbench с 2 соединениями, открытыми одновременно:
CREATE TABLE translation (
id BIGINT PRIMARY KEY AUTO_INCREMENT
);
# Suppose we have already 20 entries, we execute 2 new inserts:
1 операции:
21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation';
insert into translation (id) values (21);
транзакции 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;
вставка транзакции 1 является ладно: Вставка транзакции 2 происходит по ошибке: код ошибки: 1062. Дубликат записи ' 21 'для ключа 'PRIMARY'.
хорошим решением было бы jvdubответ, потому что за транзакцию / соединение 2 вставки будут:
1 операции:
insert into translation (id) values (null);
21 = SELECT LAST_INSERT_ID();
транзакции 2:
insert into translation (id) values (null);
22 = SELECT LAST_INSERT_ID();
# commit transaction 1;
# commit transaction 2;
но мы должны выполнить last_insert_id () сразу после вставки! И мы можем повторно использовать этот id для вставки другие таблицы, где ожидается внешний ключ!
кроме того, мы не можем выполнить 2 запроса следующим образом:
insert into translation (id) values ((SELECT AUTO_INCREMENT FROM
information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()
AND TABLE_NAME='translation'));
потому что нам действительно интересно захватить / повторно использовать этот идентификатор в другой таблице или вернуть!
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;
?>
если столбец autoincremented в sql server, чтобы увидеть текущее значение autoincremented, и если вы хотите изменить это значение для этого столбца, используйте следующий запрос.
-- to get current value
select ident_current('Table_Name')
-- to update current value
dbcc checkident ('[Table_Name]',reseed,"Your Value")