web-dev-qa-db-ja.com

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

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

249
bparise

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

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

このクエリを使用して正確にこの情報を取得できます。

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

MySQLの LAST_INSERT_ID() functionを探していると思います。コマンドラインの場合は、単に以下を実行します。

LAST_INSERT_ID();

SELECT問い合わせを通してこの値を得ることもできます:

SELECT LAST_INSERT_ID();
18
jvdub

クエリで取得するのではなく、単に番号を知りたいだけであれば、次のように使用できます。

SHOW CREATE TABLE tablename;

下部にauto_incrementが表示されます。

13
johnnyjohnny

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;
?>  
4
Murat Başar

手動でクエリを実行しても methai の答えは正しいのですが、2つの同時トランザクション/接続が実際に本番環境で実行時にこのクエリを実行すると問題が発生します。

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'が重複しています。

トランザクション/接続ごとに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をつかむ/再利用することに興味を持っているか、戻るために!

4
Davideas

SQL Serverでcolumnが自動インクリメントされている場合は現在のauto_increment値を確認し、その列の値を編集する場合は次のクエリを使用します。

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

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