获取任何表的当前AUTO_INCREMENT值

bpa*_*ise 269 mysql auto-increment

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

met*_*hai 524

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

SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ;
Run Code Online (Sandbox Code Playgroud)

您可以使用此查询获得完全相关的信息:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';
Run Code Online (Sandbox Code Playgroud)

  • 如果你删除了最后一条记录怎么办?max不会给你当前的auto_increment (40认同)
  • 也可以使用`DATABASE()`代替显式数据库名. (28认同)
  • 注意:如果尚未发出USE*DATABASE*命令,则DATABASE()为NULL (20认同)
  • 有没有理由你不能`SELECT MAX(id)FROM table_name`? (5认同)
  • 我在缓存该值时遇到了问题,因此请注意由于缓存而可能出现的错误值。 (4认同)
  • 这是否给出了表中最新的AUTO_INCREMENT值或者nnext值是什么? (3认同)
  • 这给出了下一个“自动增量”值而不是当前的“自动增量” (3认同)
  • 我已经确认它给出了下一个,假设是单用户环境。我不知道在多用户环境中操作会如何影响事情,但我目前正试图找出答案。 (2认同)
  • @Brian这种方法要快得多,MAX()必须扫描表中的所有行. (2认同)
  • 对于手动快速查找,这两个查询都非常长。我一直在寻找(但不记得确切的关键字)的是:`SHOW TABLE STATUS LIKE'table_name';`似乎不需要额外的“ FROM'DatabaseName'WHERE name ...”部分就可以正常工作。 (2认同)

jvd*_*dub 18

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

LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

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

SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

  • LAST_INSERT_ID()是每个连接.这意味着,如果另一个进程在您之后插入三个额外的行,则您的LAST_INSERT_ID()调用将与他们的不同.这个问题是要求表本身的当前AUTO_INC值. (22认同)
  • 添加一个并期望它不是最好的主意,它将是下一行的ID。同时,另一笔交易可能会插入新行,而您将使用错误的ID,对吗? (2认同)
  • 最好的答案取决于你想要达到的目标.如果您插入新行并且想要知道创建的ID,那么您的答案是最佳答案,因为LAST_INSERT_ID()是事务安全的并且确保您获得所创建对象的ID.我把你的答案投了票,但是我会删除那个"加一个......"的部分. (2认同)
  • 如果最后一个 INSERT 语句插入了不止一行,这会给你错误的答案。MySQL 文档(已添加重点):“LAST_INSERT_ID() 返回一个 64 位值,表示作为最近执行的 INSERT 语句的结果,为 AUTO_INCREMENT 列成功插入的*第一个*自动生成的值。” 直觉的!http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id (2认同)

小智 15

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

SHOW CREATE TABLE tablename;
Run Code Online (Sandbox Code Playgroud)

您应该在底部看到auto_increment

  • 如果您的表没有行且auto_increment为"1",这似乎不起作用. (5认同)

小智 5

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;
?>  
Run Code Online (Sandbox Code Playgroud)


Dav*_*eas 5

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

刚刚在MySQL工作台中手动尝试过,同时打开了2个连接:

CREATE TABLE translation (
  id BIGINT PRIMARY KEY AUTO_INCREMENT
);
# Suppose we have already 20 entries, we execute 2 new inserts:
Run Code Online (Sandbox Code Playgroud)

交易1:

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

insert into translation (id) values (21);
Run Code Online (Sandbox Code Playgroud)

交易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;
Run Code Online (Sandbox Code Playgroud)

事务1的插入是可以的:事务2的插入出错:错误代码:1062。键“ PRIMARY”的条目“ 21”重复。

一个很好的解决方案是jvdub的答案,因为对于每个事务/连接,2个插入将是:

交易1:

insert into translation (id) values (null);
21 = SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

交易2:

insert into translation (id) values (null);
22 = SELECT LAST_INSERT_ID();

# commit transaction 1;
# commit transaction 2;
Run Code Online (Sandbox Code Playgroud)

但是我们必须在插入之后执行last_insert_id()!而且,我们可以重复使用该ID并将其插入到需要外键的其他表中!

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

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

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

  • 这是一个有趣的场景,但我认为它实际上并没有回答检索“AUTO_INCRMENT”值的问题。 (3认同)
  • 很好的解释!谢谢。现在很清楚为什么我们要使用 `last_insert_id()` (2认同)

Jiř*_*iel 5

查询以检查给定模式的所有表的 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;
Run Code Online (Sandbox Code Playgroud)