回答:
次のクエリを使用して、すべてのテーブルデータを取得できます。
SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ;
このクエリを使用すると、この情報を正確に取得できます。
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND TABLE_NAME = 'TableName';
DATABASE()
明示的なデータベース名の代わりに使用することもできます。
SELECT MAX(id) FROM table_name
か?
MySQLのLAST_INSERT_ID()関数を探していると思います。コマンドラインの場合は、次のコマンドを実行します。
LAST_INSERT_ID();
SELECTクエリを通じてこの値を取得することもできます。
SELECT LAST_INSERT_ID();
クエリで取得するのではなく、単に番号を知りたい場合は、以下を使用できます。
SHOW CREATE TABLE tablename;
下部にauto_incrementが表示されます
1
。
手動でクエリを実行する場合、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を取得/再利用したり、戻ったりしたいので!
last_insert_id()
AUTO_INCREMENT
値を取得するという質問に答えるとは思いません。
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つの指定されたスキーマのすべてのテーブル(タイプの列を除く)の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;
私は同じものを探していて、ヘルパークラス内に静的メソッドを作成してしまいました(私の場合は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');
それが役に立てば幸い。