67

我目前有一个超过 600 万行并且还在增长的数据库。我目前在做 SELECT COUNT(id) FROM table;为了向我的用户显示数字,但是数据库变得越来越大,除了能够显示数字之外,我不需要存储所有这些行。有没有办法选择要显示的 auto_increment 值,以便我可以清除数据库中的大部分行?使用LAST_INSERT_ID()似乎不起作用。

4

12 回答 12

89

以下是查找AUTO_INCREMENT表的下一个值的最高效方法。即使在包含数百万个表的数据库上,这也很快,因为它不需要查询潜在的大型information_schema数据库。

mysql> SHOW TABLE STATUS LIKE 'table_name';
// Look for the Auto_increment column

但是,如果您必须在查询中检索此值,那么information_schema您必须转到数据库。

SELECT `AUTO_INCREMENT`
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_SCHEMA = 'DatabaseName'
AND    TABLE_NAME   = 'TableName';
于 2010-04-04T23:38:18.483 回答
60

如果只是关于获取记录(行)的数量,我建议使用:

SELECT TABLE_ROWS
FROM information_schema.tables 
WHERE table_name='the_table_you_want' -- Can end here if only 1 DB 
  AND table_schema = DATABASE();      -- See comment below if > 1 DB

(至少对于 MySQL)。

于 2009-06-01T04:37:22.813 回答
29

试试这个

执行此 SQL:

SHOW TABLE STATUS LIKE '<tablename>'

并获取字段的值Auto_increment

于 2009-07-10T12:07:52.967 回答
17

我不确定为什么没有人提出以下建议。这将仅使用 SQL 获得 auto_increment 值(无需使用 PHP mysql_fetch_array):

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
于 2013-09-24T22:14:22.543 回答
2

如果您通过编写选择查询直接获得最大数量,那么您的查询可能会给出错误的值。例如,如果您的表有 5 条记录,那么您的增量 id 将为 6,如果我删除第 5 条记录,您的表有 4 条记录,最大 id 为 4,在这种情况下,您将获得 5 作为下一个增量 id。为此,您可以从 mysql 定义本身获取信息。通过在php中编写以下代码

<?
$tablename      = "tablename";
$next_increment     = 0;
$qShowStatus        = "SHOW TABLE STATUS LIKE '$tablename'";
$qShowStatusResult  = mysql_query($qShowStatus) or die ( "Query failed: " . mysql_error() . "<br/>" . $qShowStatus );

$row = mysql_fetch_assoc($qShowStatusResult);
$next_increment = $row['Auto_increment'];

echo "next increment number: [$next_increment]";
?>
于 2010-12-17T09:08:33.997 回答
1

SELECT id FROM table ORDER BY id DESC LIMIT 1可以返回最大 id 而不是自动递增 id。在某些情况下两者都不同

于 2011-08-20T04:30:09.593 回答
1

如果您没有“显示状态”的权限,那么最好的选择是创建两个触发器和一个新表,以保留十亿记录表的行数。

例子:

表 A >> 十亿条记录
表 B >> 1 列和 1 行

每当 TableA(InsertTrigger) 上有插入查询时,TableB 上的行值增加 1
每当 TableA(DeleteTrigger) 上有删除查询时,TableB 中的行值减 1

于 2011-09-02T20:36:03.200 回答
0

在 information_schema 建议旁边,这个:

SELECT id FROM table ORDER BY id DESC LIMIT 1

也应该非常快,前提是 id 字段上有一个索引(我相信 auto_increment 必须是这种情况)

于 2009-06-01T04:41:52.043 回答
0
$next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table"));
$next_id['MAX(id)']; // next auto incr id

希望它有帮助:)

于 2012-10-16T09:45:15.723 回答
0

控制器

SomeNameModel::_getNextID($this->$table)

模型

class SomeNameModel extends CI_Model{

private static $db;

function __construct(){
  parent::__construct();
  self::$db-> &get_instance()->db;
}


function _getNextID($table){
  return self::$db->query("SHOW TABLE STATUS LIKE '".$table."' ")->row()->Auto_increment;
}

... other stuff code

}
于 2013-05-08T20:42:27.367 回答
0

这些答案似乎都不是很正确。我都试过了。这是我的结果。

Sending query: SELECT count(*) FROM daximation
91
Sending query: SELECT Auto_increment FROM information_schema.tables WHERE table_name='daximation'
96
Sending query: SHOW TABLE STATUS LIKE 'daximation'
98
Sending query: SELECT id FROM daximation ORDER BY id DESC LIMIT 1
97

这是屏幕截图: https ://www.screencast.com/t/s8c3trYU

这是我的PHP代码:

$query = "SELECT count(*) FROM daximation"; 
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[0]);

$query = "SELECT Auto_increment FROM information_schema.tables WHERE table_name='daximation'"; 
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[0]);

$query = "SHOW TABLE STATUS LIKE 'daximation'"; 
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[10]);

$query = "SELECT id FROM daximation ORDER BY id DESC LIMIT 1"; 
$result = sendquery($query);
$row = mysqli_fetch_row($result);
debugprint( $row[0]);
于 2017-07-16T01:05:37.890 回答
-1

难道你不能只在一个单独的表中创建一个记录,或者在一个名为“用户”的列中创建一个记录,然后用用户注册时最后插入的 id 更新它吗?

然后,您只需通过简单的查询检查该字段。

它可能很粗糙,但它会完美地工作。

于 2011-09-29T02:19:29.240 回答