Dapatkan nilai AUTO_INCREMENT saat ini untuk tabel apa pun

294

Bagaimana cara mendapatkan nilai AUTO_INCREMENT saat ini untuk tabel di MySQL?

Bparise
sumber
31
Pertanyaan ini belum tentu merupakan duplikat. Pertanyaan yang ditautkan adalah meminta jumlah baris, dan jawaban yang diterima HANYA mendapatkan jumlah baris, BUKAN AUTO_INCREMENT - yang merupakan pertanyaan yang sama sekali berbeda.
methai

Jawaban:

569

Anda bisa mendapatkan semua data tabel dengan menggunakan kueri ini:

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

Anda bisa mendapatkan informasi ini dengan menggunakan kueri ini:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';
methai
sumber
34
Bisa juga menggunakan DATABASE()bukan nama database eksplisit.
M. Suleiman
22
Catatan: DATABASE () adalah NULL jika Anda belum mengeluarkan perintah USE DATABASE
methai
5
Apakah ada alasan Anda tidak bisa SELECT MAX(id) FROM table_name?
Brian
43
bagaimana jika Anda menghapus catatan terakhir? max tidak akan memberi Anda auto_increment saat ini
peterpeterson
3
Apakah ini memberikan nilai AUTO_INCREMENT terbaru dalam tabel atau apa nilai nnext selanjutnya?
sidx
18

Saya yakin Anda sedang mencari fungsi LAST_INSERT_ID () MySQL . Jika di baris perintah, jalankan saja yang berikut:

LAST_INSERT_ID();

Anda juga bisa mendapatkan nilai ini melalui kueri SELECT:

SELECT LAST_INSERT_ID();
jvdub
sumber
3
Bukan ide terbaik untuk menambahkan satu ke dalamnya dan berharap, itu akan menjadi ID dari baris berikutnya. Sementara itu, transaksi lain dapat menyisipkan baris baru dan Anda akan menggunakan ID yang salah, bukan?
agim
Kamu benar. Saya kira itu tergantung pada lingkungan tempat Anda menjalankan. Jika ini adalah lingkungan pengujian yang terkontrol, maka kemungkinan besar Anda dapat menambahkannya dan aman. Jawaban terbaik diberikan oleh methai.
jvdub
2
Apa jawaban terbaiknya, tergantung pada apa yang ingin Anda capai. Jika Anda memasukkan baris baru dan Anda ingin tahu ID yang dibuat, maka jawaban Anda adalah jawaban terbaik, karena LAST_INSERT_ID () aman untuk transaksi dan memastikan, Anda mendapatkan ID untuk objek yang dibuat. Saya memilih jawaban Anda tetapi saya akan menghapus bagian dengan 'tambahkan satu untuk itu ...'
agim
25
LAST_INSERT_ID () adalah per koneksi. Itu berarti, jika proses lain memasukkan tiga baris tambahan setelah Anda, panggilan LAST_INSERT_ID () Anda akan berbeda dari mereka. Pertanyaan ini menanyakan nilai AUTO_INC saat ini pada tabel itu sendiri.
methai
2
Jika pernyataan INSERT terakhir memasukkan lebih dari satu baris, ini akan memberi Anda jawaban yang salah. Dokumentasi MySQL (penekanan ditambahkan): "LAST_INSERT_ID () mengembalikan nilai 64-bit yang mewakili nilai yang dibuat secara otomatis pertama yang berhasil dimasukkan untuk kolom AUTO_INCREMENT sebagai hasil dari pernyataan INSERT yang baru saja dieksekusi." Intuitif! dev.mysql.com/doc/refman/5.6/en/…
Charlie
15

Jika Anda hanya ingin tahu nomornya, daripada mendapatkannya dalam kueri maka Anda dapat menggunakan:

SHOW CREATE TABLE tablename;

Anda seharusnya melihat auto_increment di bagian bawah

johnnyjohnny
sumber
5
Ini tampaknya tidak berfungsi jika tabel Anda tidak memiliki baris dan auto_increment di 1.
Pacerier
6

Meskipun jawaban methai benar jika Anda menjalankan kueri secara manual, masalah terjadi ketika 2 transaksi / koneksi bersamaan benar-benar menjalankan kueri ini saat runtime dalam produksi (misalnya).

Baru saja mencoba secara manual di meja kerja MySQL dengan 2 koneksi dibuka secara bersamaan:

CREATE TABLE translation (
  id BIGINT PRIMARY KEY AUTO_INCREMENT
);
# Suppose we have already 20 entries, we execute 2 new inserts:

Transaksi 1:

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

insert into translation (id) values (21);

Transaksi 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;

Sisipan transaksi 1 ok: Sisipan transaksi 2 salah: Kode Kesalahan: 1062. Entri duplikat '21' untuk kunci 'PRIMER'.

Solusi yang bagus akan menjadi jawaban jvdub karena per transaksi / koneksi 2 sisipan akan menjadi:

Transaksi 1:

insert into translation (id) values (null);
21 = SELECT LAST_INSERT_ID();

Transaksi 2:

insert into translation (id) values (null);
22 = SELECT LAST_INSERT_ID();

# commit transaction 1;
# commit transaction 2;

Tetapi kita harus menjalankan last_insert_id () tepat setelah memasukkan! Dan kita dapat menggunakan kembali id ​​itu untuk dimasukkan ke tabel lain di mana kunci asing diharapkan!

Selain itu, kami tidak dapat menjalankan 2 kueri sebagai berikut:

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

karena kami sebenarnya tertarik untuk mengambil / menggunakan kembali ID itu di tabel lain atau untuk kembali!

Davideas
sumber
2
Penjelasan yang bagus! Terima kasih. Sekarang sudah jelas mengapa kita ingin menggunakanlast_insert_id()
Imtiaz
Ini adalah skenario yang menarik, tetapi saya tidak berpikir itu benar-benar menjawab pertanyaan yang mengambil AUTO_INCREMENTnilai.
Sharlike
4

kode sampel yang dapat dieksekusi 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;
?>  
Murat Başar
sumber
1

Jika kolom bertambah otomatis di sql server maka untuk melihat nilai penambahan otomatis saat ini, dan jika Anda ingin mengedit nilai itu untuk kolom itu gunakan kueri berikut.

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

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

Permintaan untuk memeriksa persentase "penggunaan" AUTO_INCREMENT untuk semua tabel dari satu skema yang diberikan (kecuali kolom dengan tipe bigint yang tidak ditandatangani ):

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;
Jiří Chmiel
sumber
0

Saya mencari yang sama dan berakhir dengan membuat metode statis di dalam kelas Helper (dalam kasus saya saya menamakannya App \ Helpers \ Database).

Metode

/**
 * 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;
}

Untuk memanggil metode dan dapatkan AUTO_INCREMENT MySql cukup gunakan yang berikut ini:

$auto_increment = \App\Helpers\Database::getAutoIncrementValue(env('DB_DATABASE'), 'your_table_name');

Semoga ini bisa membantu.

McRui
sumber