Получить текущее значение AUTO_INCREMENT для любой таблицы

235

Как получить текущее значение AUTO_INCREMENT для таблицы в MySQL?

  • 30
    Этот вопрос не обязательно дубликат. В связанном вопросе запрашивается количество строк, а принятый ответ ТОЛЬКО получает количество строк, а НЕ AUTO_INCREMENT - это совершенно другой вопрос.
Теги:
auto-increment

6 ответов

496
Лучший ответ

Вы можете получить все данные таблицы, используя этот запрос:

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

Вы можете получить именно эту информацию, используя этот запрос:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';
  • 4
    Вау, свет быстро !! Спасибо!! +2 балла
  • 26
    Также можно использовать DATABASE() вместо явного имени базы данных.
Показать ещё 14 комментариев
19

Я считаю, что вы ищете функцию MySQL LAST_INSERT_ID(). Если в командной строке просто запустите следующее:

LAST_INSERT_ID();

Вы также можете получить это значение с помощью запроса SELECT:

SELECT LAST_INSERT_ID();
  • 1
    Это не лучшая идея, чтобы добавить один к нему и ожидать, что это будет идентификатор следующей строки. В то же время другая транзакция может вставить новую строку, и вы бы использовали неправильный идентификатор, верно?
  • 0
    Ты прав. Я предполагаю, что это зависит от среды, в которой вы работаете. Если это контролируемая среда тестирования, то вы, скорее всего, можете добавить ее и быть в безопасности. Лучший ответ был предоставлен methai.
Показать ещё 5 комментариев
12

Если вы просто хотите узнать номер, а не получить его в запросе, вы можете использовать:

SHOW CREATE TABLE tablename;

Вы должны увидеть auto_increment внизу

  • 4
    Кажется, это не работает, если в вашей таблице нет строк, а auto_increment равен 1 .
4

Несмотря на то, что ответ methai является правильным, если вы выполняете запрос вручную, возникает проблема, когда 2 одновременных транзакции/соединения фактически выполняют этот запрос во время выполнения в производстве (например).

Только что попробовал вручную в MySQL верстак с 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() сразу после вставки! И мы можем повторно использовать этот идентификатор для вставки в другие таблицы, где ожидается внешний ключ!

Также мы не можем выполнить 2 запроса следующим образом:

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

потому что мы на самом деле заинтересованы, чтобы захватить/повторно использовать этот идентификатор в другой таблице или вернуть!

  • 1
    Хорошее объяснение! Благодарю. Теперь понятно, почему мы хотим использовать last_insert_id()
  • 0
    Это интересный сценарий, но я не думаю, что на самом деле он отвечает на вопрос о том, как получить значение AUTO_INCREMENT .
3

Пример исполняемого кода 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;
?>  
1

Если столбец автоинкрементирован на сервере sql, то для просмотра текущего автоинкрементного значения, и если вы хотите отредактировать это значение для этого столбца, используйте следующий запрос.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню