MySQL のテーブルの現在の AUTO_INCREMENT 値を取得するにはどうすればよいですか?
9 に答える
クエリで取得するのではなく、単に番号を知りたい場合は、次を使用できます。
SHOW CREATE TABLE tablename;
下部に auto_increment が表示されるはずです
MySQL のLAST_INSERT_ID()関数を探していると思います。コマンド ラインの場合は、次のコマンドを実行するだけです。
LAST_INSERT_ID();
この値は、SELECT クエリを使用して取得することもできます。
SELECT LAST_INSERT_ID();
クエリを手動で実行する場合、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);
}
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;
?>
list dbname すべてのタブ名と AUTO_INCREMENT
SELECT `AUTO_INCREMENT`,`TABLE_NAME`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbname' ORDER BY AUTO_INCREMENT desc