343

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

4

9 に答える 9

22

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

SHOW CREATE TABLE tablename;

下部に auto_increment が表示されるはずです

于 2015-01-16T09:33:20.267 に答える
17

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

LAST_INSERT_ID();

この値は、SELECT クエリを使用して取得することもできます。

SELECT LAST_INSERT_ID();
于 2013-04-04T21:03:43.577 に答える
9

クエリを手動で実行する場合、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 を取得/再利用するか、返すことに関心があるためです。

編集: 2021 年 2 月 8 日、値の取得

アプリケーションで実際に値を取得するには (MyBatis を使用して Java で行った例):

@Mapper
public interface ClientMapper {
    @Select("select last_insert_id()")
    Long getLastInsertedId();

    @Insert({...})
    void insertClientInfo(ClientInfo client);
}

そして、リポジトリで

public void insertClientInfo(ClientInfo clientInfo) {
    mapper.insertClientInfo(clientInfo);
    Long pk = mapper.getLastInsertedId();
    clientInfo.setId(pk);
}
于 2017-08-20T21:31:03.580 に答える
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;
?>  
于 2015-05-05T14:38:22.833 に答える
1

list dbname すべてのタブ名と AUTO_INCREMENT

SELECT `AUTO_INCREMENT`,`TABLE_NAME`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbname' ORDER BY AUTO_INCREMENT desc
于 2021-12-25T03:09:55.113 に答える