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

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

178
задан bparise 04 апр. '13 в 23:55
источник поделиться
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';
371
ответ дан methai 04 апр. '13 в 23:56
источник поделиться

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

LAST_INSERT_ID();

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

SELECT LAST_INSERT_ID();
19
ответ дан jvdub 05 апр. '13 в 0:03
источник поделиться

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

SHOW CREATE TABLE tablename;

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

10
ответ дан johnnyjohnny 16 янв. '15 в 12:33
источник поделиться

код исполняемого кода 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;
    ?>  
3
ответ дан Murat Başar 05 мая '15 в 17:38
источник поделиться

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

Просто попробовал вручную в workbench MySQL с двумя открытыми одновременно соединениями:

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

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

3
ответ дан Davidea 21 авг. '17 в 0:31
источник поделиться

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

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

-- to update current value
dbcc checkident ('[Table_Name]',reseed,"Your Value")
1
ответ дан Mukul 02 авг. '17 в 11:28
источник поделиться

Другие вопросы по меткам