รับค่า AUTO_INCREMENT ปัจจุบันสำหรับตารางใด ๆ


294

ฉันจะรับค่า AUTO_INCREMENT ปัจจุบันสำหรับตารางใน MySQL ได้อย่างไร


31
คำถามนี้ไม่จำเป็นต้องซ้ำกัน คำถามที่เชื่อมโยงจะขอจำนวนแถวและคำตอบที่ยอมรับจะได้รับจำนวนแถวเท่านั้นไม่ใช่ AUTO_INCREMENT ซึ่งเป็นคำถามที่แตกต่างกันโดยสิ้นเชิง
methai

คำตอบ:


569

คุณสามารถรับข้อมูลตารางทั้งหมดโดยใช้แบบสอบถามนี้:

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

คุณสามารถรับข้อมูลนี้โดยใช้แบบสอบถามนี้:

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

34
ยังสามารถใช้DATABASE()แทนชื่อฐานข้อมูลที่ชัดเจน
M. Suleiman

22
หมายเหตุ: ฐานข้อมูล () เป็นโมฆะถ้าคุณยังไม่ได้ออกใช้ฐานข้อมูลคำสั่ง
methai

5
มีเหตุผลที่คุณทำไม่ได้SELECT MAX(id) FROM table_nameเหรอ?
Brian

43
ถ้าคุณลบบันทึกล่าสุด สูงสุดจะไม่ให้ auto_increment ปัจจุบันกับคุณ
peterpeterson

3
สิ่งนี้ให้ค่า AUTO_INCREMENT ล่าสุดในตารางหรือไม่ว่าค่า nnext จะเป็นเท่าใด
sidx

18

ฉันเชื่อว่าคุณกำลังมองหาฟังก์ชันLAST_INSERT_ID ()ของ MySQL หากอยู่ในบรรทัดคำสั่งให้เรียกใช้สิ่งต่อไปนี้:

LAST_INSERT_ID();

คุณสามารถรับค่านี้ผ่านการสืบค้น SELECT:

SELECT LAST_INSERT_ID();

3
ไม่ใช่ความคิดที่ดีที่สุดในการเพิ่มเข้ามาและคาดว่าจะเป็นรหัสของแถวถัดไป ในขณะเดียวกันการทำธุรกรรมอื่นสามารถแทรกแถวใหม่และคุณจะใช้ ID ผิดใช่มั้ย
agim

คุณถูก. ฉันเดาว่ามันขึ้นอยู่กับสภาพแวดล้อมที่คุณใช้ถ้ามันเป็นสภาพแวดล้อมการทดสอบที่ควบคุมได้ คำตอบที่ดีที่สุดคือให้โดย methai
jvdub

2
คำตอบที่ดีที่สุดคืออะไรขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ หากคุณแทรกแถวใหม่และต้องการทราบ ID ที่สร้างขึ้นคำตอบของคุณคือคำตอบที่ดีที่สุดเนื่องจาก LAST_INSERT_ID () เป็นธุรกรรมที่ปลอดภัยและมั่นใจได้ว่าคุณได้รับ ID สำหรับวัตถุที่สร้างขึ้น ฉันโหวตคำตอบของคุณแล้ว แต่ฉันจะลบส่วนด้วย 'เพิ่มเข้าไป ... '
agim

25
LAST_INSERT_ID () ต่อการเชื่อมต่อ ซึ่งหมายความว่าหากกระบวนการอื่นแทรกแถวเพิ่มเติมสามแถวหลังจากคุณ LAST_INSERT_ID การโทรของคุณจะแตกต่างจากของพวกเขา คำถามนี้ถามหา AUTO_INC val ปัจจุบันบนโต๊ะตัวเอง
methai

2
หากคำสั่ง INSERT ล่าสุดแทรกมากกว่าหนึ่งแถวคำสั่งนี้จะให้คำตอบที่ผิด เอกสารประกอบ MySQL (เน้นการเพิ่ม): "LAST_INSERT_ID () ส่งคืนค่า 64 บิตที่แสดงถึงค่าที่สร้างขึ้นครั้งแรกโดยอัตโนมัติแทรกสำเร็จสำหรับคอลัมน์ AUTO_INCREMENT อันเป็นผลมาจากคำสั่ง INSERT ที่ดำเนินการล่าสุด ที่ใช้งานง่าย! dev.mysql.com/doc/refman/5.6/en/…
Charlie

15

หากคุณเพียงต้องการทราบจำนวนแทนที่จะได้ในแบบสอบถามคุณสามารถใช้:

SHOW CREATE TABLE tablename;

คุณควรเห็น auto_increment ที่ด้านล่าง


5
นี้ดูเหมือนจะไม่ทำงานถ้าตารางของคุณไม่เคยมีใครแถวและ auto_increment 1ที่
Pacerier

6

แม้ว่าคำตอบของmethaiนั้นถูกต้องหากคุณเรียกใช้แบบสอบถามด้วยตนเองปัญหาจะเกิดขึ้นเมื่อ 2 ธุรกรรม / การเชื่อมต่อที่เกิดขึ้นพร้อมกันดำเนินการแบบสอบถามนี้จริงที่รันไทม์ในการผลิต (เช่น)

เพิ่งลองด้วยตนเองใน MySQL workbench โดยมี 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 เกิดข้อผิดพลาด: รหัสข้อผิดพลาด: 1,062 รายการที่ซ้ำกัน '21' สำหรับคีย์ 'หลัก'

ทางออกที่ดีจะเป็นคำตอบของjvdubเพราะต่อการทำธุรกรรม / การเชื่อมต่อ 2 แทรกจะเป็น:

ธุรกรรม 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 ()หลังการแทรก! และเราสามารถนำรหัสนั้นกลับมาใช้ใหม่ในตารางอื่น ๆ ที่คาดว่าจะมีรหัสต่างประเทศ!

นอกจากนี้เราไม่สามารถดำเนินการ 2 แบบสอบถามดังต่อไปนี้:

insert into translation (id) values ((SELECT AUTO_INCREMENT FROM
    information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()
    AND TABLE_NAME='translation'));

เพราะเราสนใจที่จะคว้า / นำ ID นั้นกลับมาใช้ซ้ำในตารางอื่นหรือเพื่อส่งคืน!


2
คำอธิบายที่ดี! ขอบคุณ ตอนนี้มันชัดเจนแล้วว่าทำไมเราถึงต้องการใช้last_insert_id()
Imtiaz

นี่เป็นสถานการณ์ที่น่าสนใจ แต่ฉันไม่คิดว่าจริง ๆ แล้วมันตอบคำถามที่จะดึงAUTO_INCREMENTค่า
Sharlike

4

โค้ดตัวอย่างที่รันได้ 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

หากคอลัมน์ถูกรวมไว้โดยอัตโนมัติในเซิร์ฟเวอร์ sql ดังนั้นเพื่อดูค่าการรวมอัตโนมัติปัจจุบันและหากคุณต้องการแก้ไขค่านั้นสำหรับคอลัมน์นั้นให้ใช้แบบสอบถามต่อไปนี้

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

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

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;

0

ฉันกำลังมองหาสิ่งเดียวกันและลงเอยด้วยการสร้างวิธีการคงที่ภายในคลาสตัวช่วย (ในกรณีของฉันฉันตั้งชื่อมันว่า 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');

หวังว่ามันจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.