Làm cách nào để tôi nhận được giá trị AUTO_INCREMENT hiện tại cho một bảng trong MySQL?
Làm cách nào để tôi nhận được giá trị AUTO_INCREMENT hiện tại cho một bảng trong MySQL?
Câu trả lời:
Bạn có thể lấy tất cả dữ liệu bảng bằng cách sử dụng truy vấn này:
SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ;
Bạn có thể nhận được chính xác thông tin này bằng cách sử dụng truy vấn này:
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND TABLE_NAME = 'TableName';
DATABASE()
thay vì tên cơ sở dữ liệu rõ ràng.
SELECT MAX(id) FROM table_name
?
Tôi tin rằng bạn đang tìm kiếm hàm LAST_INSERT_ID () của MySQL . Nếu trong dòng lệnh, chỉ cần chạy như sau:
LAST_INSERT_ID();
Bạn cũng có thể có được giá trị này thông qua truy vấn CHỌN:
SELECT LAST_INSERT_ID();
Nếu bạn chỉ muốn biết số, thay vì lấy nó trong truy vấn thì bạn có thể sử dụng:
SHOW CREATE TABLE tablename;
Bạn sẽ thấy auto_increment ở phía dưới
1
.
Mặc dù câu trả lời của methai là chính xác nếu bạn chạy truy vấn theo cách thủ công, một sự cố xảy ra khi 2 giao dịch / kết nối đồng thời thực sự thực hiện truy vấn này khi chạy trong sản xuất (ví dụ).
Chỉ cần thử thủ công trong bàn làm việc của MySQL với 2 kết nối được mở đồng thời:
CREATE TABLE translation (
id BIGINT PRIMARY KEY AUTO_INCREMENT
);
# Suppose we have already 20 entries, we execute 2 new inserts:
Giao dịch 1:
21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation';
insert into translation (id) values (21);
Giao dịch 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;
Chèn giao dịch 1 là ok: Chèn giao dịch 2 gặp lỗi: Mã lỗi: 1062. Mục nhập trùng lặp '21' cho khóa 'CHÍNH HÃNG'.
Một giải pháp tốt sẽ là câu trả lời của jvdub vì mỗi giao dịch / kết nối, 2 lần chèn sẽ là:
Giao dịch 1:
insert into translation (id) values (null);
21 = SELECT LAST_INSERT_ID();
Giao dịch 2:
insert into translation (id) values (null);
22 = SELECT LAST_INSERT_ID();
# commit transaction 1;
# commit transaction 2;
Nhưng chúng ta phải thực thi last_insert_id () ngay sau khi chèn! Và chúng ta có thể sử dụng lại id đó để được chèn vào các bảng khác nơi dự kiến sẽ có khóa ngoại!
Ngoài ra, chúng tôi không thể thực hiện 2 truy vấn như sau:
insert into translation (id) values ((SELECT AUTO_INCREMENT FROM
information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()
AND TABLE_NAME='translation'));
bởi vì chúng tôi thực sự quan tâm đến việc lấy / sử dụng lại ID đó trong bảng khác hoặc để trả về!
last_insert_id()
AUTO_INCREMENT
giá trị.
mã mẫu thực thi 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;
?>
Nếu cột được tự động tăng trong máy chủ sql thì để xem giá trị tự động hiện tại và nếu bạn muốn chỉnh sửa giá trị đó cho cột đó, hãy sử dụng truy vấn sau.
-- to get current value
select ident_current('Table_Name')
-- to update current value
dbcc checkident ('[Table_Name]',reseed,"Your Value")
Truy vấn để kiểm tra tỷ lệ phần trăm "sử dụng" của AUTO_INCREMENT cho tất cả các bảng của một lược đồ đã cho (trừ các cột có loại bigint không dấu ):
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;
Tôi đã tìm kiếm tương tự và kết thúc bằng cách tạo một phương thức tĩnh bên trong lớp Trình trợ giúp (trong trường hợp của tôi, tôi đặt tên cho nó là App \ Helpers \ Database).
Phương pháp
/**
* 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;
}
Để gọi phương thức và nhận MySql AUTO_INCREMENT, chỉ cần sử dụng như sau:
$auto_increment = \App\Helpers\Database::getAutoIncrementValue(env('DB_DATABASE'), 'your_table_name');
Hy vọng nó giúp.