任意のテーブルの現在のAUTO_INCREMENT値を取得します


294

MySQLのテーブルの現在のAUTO_INCREMENT値を取得するにはどうすればよいですか?


31
この質問は必ずしも重複しているわけではありません。リンクされた質問は行数を要求しており、受け入れられた回答は行数のみを取得し、AUTO_INCREMENTは取得しません-これは完全に異なる質問です。
メタイ2013

回答:


569

次のクエリを使用して、すべてのテーブルデータを取得できます。

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.スレイマン

22
注:USE DATABASEコマンドを発行していない場合、DATABASE()はNULLです
methai

5
できない理由はありますSELECT MAX(id) FROM table_nameか?
ブライアン、

43
最後のレコードを削除した場合はどうなりますか?maxは現在のauto_incrementを与えません
peterpeterson

3
これにより、テーブル内の最新のAUTO_INCREMENT値が得られますか、それともnnext値がどうなるのでしょうか?
sidx 2015

18

MySQLのLAST_INSERT_ID()関数を探していると思います。コマンドラインの場合は、次のコマンドを実行します。

LAST_INSERT_ID();

SELECTクエリを通じてこの値を取得することもできます。

SELECT LAST_INSERT_ID();

3
それに1を追加して期待するのは最良のアイデアではありません。次の行のIDになります。その間、別のトランザクションが新しい行を挿入し、間違ったIDを使用する可能性がありますか?
agim 2013

あなたが正しい。それは実行している環境に依存すると思います。それが制御されたテスト環境である場合、おそらく1つ追加して安全です。最良の答えはメタイによって提供されました。
jvdub 2013

2
最良の答えは、何を達成したいかによります。LAST_INSERT_ID()はトランザクションに対して安全であり、作成されたオブジェクトのIDを確実に取得できるため、新しい行を挿入し、作成されたIDを知りたい場合は、あなたの答えが最良の答えです。私はあなたの回答に賛成票を投じましたが、「1つ追加する」でその部分を削除します
agim

25
LAST_INSERT_ID()は接続ごとです。つまり、別のプロセスがあなたの後に3つの追加の行を挿入した場合、YOUR LAST_INSERT_ID()呼び出しはそれらのものとは異なります。この質問は、テーブル自体の現在のAUTO_INC値を求めています。
メタイ2013

2
最後のINSERTステートメントが複数の行を挿入した場合、これは間違った答えを与えます。MySQLのドキュメント(強調を追加):「LAST_INSERT_ID()は、最後に実行されたINSERTステートメントの結果として、AUTO_INCREMENTカラムに正常に挿入された最初の自動生成値を表す64ビット値を返します。」直感的!dev.mysql.com/doc/refman/5.6/en/...
チャーリー

15

クエリで取得するのではなく、単に番号を知りたい場合は、以下を使用できます。

SHOW CREATE TABLE tablename;

下部にauto_incrementが表示されます


5
テーブルに行がなく、auto_incrementがにある場合、これは機能しないようです1
Pacerier、2015

6

手動でクエリを実行する場合、methaiの答えは正しいですが、2つの同時トランザクション/接続が実際に(たとえば)実行時にこのクエリを実際に実行すると問題が発生します。

2つの接続を同時に開いて、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。キー 'PRIMARY'のエントリ '21'が重複しています。

トランザクション/接続ごとに2つの挿入が次のようになるので、jvdubの答えは良い解決策です。

トランザクション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'));

私たちは実際に他のテーブルでその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サーバーで列が自動インクリメントされている場合、現在の自動インクリメントされた値を確認し、その列の値を編集する場合は、次のクエリを使用します。

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

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

1

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

私は同じものを探していて、ヘルパークラス内に静的メソッドを作成してしまいました(私の場合は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');

それが役に立てば幸い。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.