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 です。この場合、次のインクリメント ID として 5 を取得します。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

「ステータスの表示」の権限がない場合は、2つのトリガーと、10億レコードのテーブルの行数を保持する新しいテーブルを作成するのが最善の方法です。

例:

TableA>>Billionレコード
TableB>>1列と1行

TableA(InsertTrigger)に挿入クエリがある場合は常に、行の値を1つインクリメントし
ますTableB TableA(DeleteTrigger)に削除クエリがある場合は常に、TableBで行の値を1つデクリメントします

于 2011-09-02T20:36:03.200 に答える
1

SELECT id FROM table ORDER BY id DESC LIMIT 1自動インクリメント ID ではなく、最大 ID を返すことができます。どちらもいくつかの条件で異なります

于 2011-08-20T04:30:09.593 に答える
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

information_schema 提案の横に、これ:

SELECT id FROM table ORDER BY id DESC LIMIT 1

id フィールドにインデックスがある場合は、非常に高速になるはずです (これは auto_increment の場合に当てはまると思います)。

于 2009-06-01T04:41:52.043 に答える
-1

別のテーブルなどにレコードを作成して、ユーザーと呼ばれる列を作成し、ユーザー登録で最後に挿入された ID で更新することはできませんか?

次に、単純なクエリでこのフィールドを確認します。

ラフかもしれませんが、完璧に機能します。

于 2011-09-29T02:19:29.240 に答える