获取任何表的当前AUTO_INCREMENT值


294

如何获取MySQL中表的当前AUTO_INCREMENT值?


31
这个问题不一定是重复的。链接的问题要求行数,被接受的答案仅得到行数,而不是AUTO_INCREMENT-这是一个完全不同的问题。
methai 2013年

Answers:


568

您可以使用以下查询获取所有表数据:

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

通过使用以下查询,您可以准确地获取以下信息:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';

34
也可以使用DATABASE()代替显式的数据库名称。
M. Suleiman

22
注意:如果您尚未发出USE DATABASE命令,则DATABASE()为NULL
2013年

5
有没有原因不能SELECT MAX(id) FROM table_name呢?
布赖恩

43
如果删除最后一条记录怎么办?max不会给您当前的auto_increment
peterpeterson

3
这会给出表中最新的AUTO_INCREMENT值还是nnext值是什么?
sidx

18

我相信您正在寻找MySQL的LAST_INSERT_ID()函数。如果在命令行中,只需运行以下命令:

LAST_INSERT_ID();

您还可以通过SELECT查询获得此值:

SELECT LAST_INSERT_ID();

3
添加一个并期望它不是最好的主意,它将是下一行的ID。同时,另一笔交易可能会插入新行,而您将使用错误的ID,对吗?
2013年

你是对的。我猜这取决于您所运行的环境。如果这是一个受控的测试环境,那么您很可能会添加一个并且安全。最好的答案是由methai提供的。
jvdub

2
最佳答案是什么,取决于您要实现的目标。如果您插入新行并想知道创建的ID,那么您的答案就是最好的答案,因为LAST_INSERT_ID()是事务安全的,并且可以确保您获得了创建对象的ID。我对您的答案投了赞成票,但我将删除“添加一个……”的部分
agim 2013年

25
LAST_INSERT_ID()是每个连接的。这意味着,如果另一个进程在您之后插入三行,您的LAST_INSERT_ID()调用将与它们不同。这个问题是要在表本身上查询当前的AUTO_INC val。
methai 2013年

2
如果最后一个INSERT语句插入了多行,这将给您错误的答案。MySQL文档(添加了重点):“ LAST_INSERT_ID()返回一个64位值,该值表示由于最近执行的INSERT语句而成功为AUTO_INCREMENT列成功插入的第一个自动生成的值。” 直观!dev.mysql.com/doc/refman/5.6/en/…–
查理(Charlie)

15

如果您只是想知道该数字,而不是在查询中获取它,则可以使用:

SHOW CREATE TABLE tablename;

您应该在底部看到auto_increment


5
如果您的表没有行并且auto_increment位于at,这似乎不起作用1
Pacerier

6

如果您手动运行查询,即使methai的答案是正确的,但是当两个并发事务/连接实际上在生产中的运行时执行此查询时,就会发生问题。

刚刚在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。键“ PRIMARY”的条目“ 21”重复。

一个很好的解决方案是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并将其插入到需要外键的其他表中!

另外,我们无法执行以下两个查询:

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

因为我们实际上有兴趣在其他表中获取/重用该ID或返回它!


2
很好的解释!谢谢。现在很清楚我们为什么要使用last_insert_id()
Imtiaz

这是一个有趣的场景,但是我认为它实际上并没有回答要获取AUTO_INCREMENT值的问题。
Sharlike

4

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 server中是自动递增的,则要查看当前的自动递增值,并且如果要编辑该列的值,请使用以下查询。

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

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

1

查询以检查一个给定模式的所有表的AUTO_INCREMENT的“使用”百分比(具有bigint unsigned类型的列除外):

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;

0

我一直在寻找相同的东西,最后在Helper类中创建了一个静态方法(在我的情况下,我将其命名为App \ Helpers \ Database)。

方法

/**
 * 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;
}

要调用该方法并获取MySql AUTO_INCREMENT,只需使用以下命令:

$auto_increment = \App\Helpers\Database::getAutoIncrementValue(env('DB_DATABASE'), 'your_table_name');

希望能帮助到你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.