Herhangi bir tablo için geçerli AUTO_INCREMENT değerini alın


295

MySQL'de bir tablo için geçerli AUTO_INCREMENT değerini nasıl alabilirim?


31
Bu sorunun mutlaka bir kopyası olması gerekmez. Bağlantılı soru satır sayısını soruyor ve kabul edilen cevap SADECE tamamen farklı bir soru olan AUTO_INCREMENT değil satır sayısını alıyor.
methai

Yanıtlar:


570

Bu sorguyu kullanarak tüm tablo verilerini alabilirsiniz:

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

Bu sorguyu kullanarak tam olarak bu bilgileri alabilirsiniz:

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

34
DATABASE()Açık veritabanı adı yerine de kullanılabilir .
M Süleyman

22
Not: DATABASE (), bir KULLANIM VERİTABANI komutu
vermediyseniz NULL'dur

5
Yapamamanın bir nedeni var mı SELECT MAX(id) FROM table_name?
Brian

43
son kaydı sildiyseniz ne olur? max size şu anki auto_increment'ı vermeyecektir
peterpeterson

4
Bu tablodaki en son AUTO_INCREMENT değerini veriyor mu veya nnext değeri ne olacak?
sidx

18

MySQL'in LAST_INSERT_ID () işlevini aradığınızı düşünüyorum . Komut satırındaysanız, aşağıdakileri yapmanız yeterlidir:

LAST_INSERT_ID();

Bu değeri bir SELECT sorgusu yoluyla da alabilirsiniz:

SELECT LAST_INSERT_ID();

3
Birini eklemek ve beklemek en iyi fikir değil, bir sonraki satırın kimliği olacak. Bu arada başka bir işlem yeni bir satır ekleyebilir ve yanlış kimliği doğru mu kullanacaksınız?
agim

Haklısın. Sanırım içinde çalıştığınız ortama bağlı. Kontrollü bir test ortamı ise, büyük olasılıkla bir tane ekleyebilir ve güvende olabilirsiniz. En iyi cevap methai tarafından verildi.
jvdub

2
En iyi cevap nedir, ne elde etmek istediğinize bağlıdır. Yeni bir satır eklerseniz ve oluşturulan kimliği bilmek istiyorsanız, yanıtınız en iyi yanıttır, çünkü LAST_INSERT_ID () işlem güvenli olduğundan ve oluşturduğunuz nesnenin kimliğini aldığınızdan emin olun. Cevabınızı
oyladım

25
Bağlantı başına LAST_INSERT_ID (). Bu, sizden sonra başka bir işlem üç ek satır eklerse, SİZİN LAST_INSERT_ID () çağrısı onlarınkinden farklı olacaktır. Bu soru tablonun kendisinde geçerli AUTO_INC val soruyor.
methai

2
Son INSERT ifadesi birden fazla satır eklediyse, bu size yanlış yanıtı verecektir. MySQL belgeleri (vurgu eklenmiştir): "LAST_INSERT_ID () , en son yürütülen INSERT deyiminin bir sonucu olarak AUTO_INCREMENT sütunu için başarıyla eklenen ilk otomatik olarak oluşturulan değeri temsil eden 64 bitlik bir değer döndürür ." Sezgisel! dev.mysql.com/doc/refman/5.6/en/…
Charlie

16

Sadece bir sorguya almak yerine, numarayı bilmek istiyorsanız o zaman kullanabilirsiniz:

SHOW CREATE TABLE tablename;

Auto_increment'ı altta görmelisiniz


5
Tablonuzda hiç satır yoksa ve auto_increment konumunda ise bu işe yaramaz 1.
Pacerier

6

Olsa methai el sorguyu çalıştırırsanız 'ın yanıt doğrudur 2 eşzamanlı işlem / bağlantıları aslında (örneğin) üretimde zamanında bu sorguyu yürütmek zaman, bir sorun oluşur.

Aynı anda açılan 2 bağlantı ile MySQL tezgahında manuel olarak denedim:

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

İşlem 1:

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

insert into translation (id) values (21);

İşlem 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;

İşlem 1'in eklenmesi tamam: İşlem 2'nin eklenmesi hata veriyor: Hata Kodu: 1062. 'PRIMARY' anahtarı için yinelenen '21' girişi.

İyi bir çözüm jvdub'ın cevabı olacaktır çünkü işlem / bağlantı başına 2 ek:

İşlem 1:

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

İşlem 2:

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

# commit transaction 1;
# commit transaction 2;

Ancak last_insert_id () öğesini eklemeden hemen sonra yürütmeliyiz ! Ve bu kimliği yabancı anahtarın beklendiği diğer tablolara eklenecek şekilde tekrar kullanabiliriz!

Ayrıca, 2 sorguyu aşağıdaki gibi yürütemeyiz:

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

çünkü biz aslında diğer tablodaki bu kimliği kapmak / yeniden kullanmak veya geri dönmek istiyoruz!


2
İyi açıklama! Teşekkürler. Şimdi neden kullanmak istediğimiz açıklast_insert_id()
Imtiaz

Bu ilginç bir senaryo, ama aslında AUTO_INCREMENTdeğeri almak için soruyu cevapladığını sanmıyorum .
Sharlike

4

mysqli yürütülebilir örnek kodu:

<?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

Sütun sql sunucusunda autoincremented ise, geçerli autoincremented değerini görmek için ve bu sütun için bu değeri düzenlemek istiyorsanız aşağıdaki sorguyu kullanın.

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

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

1

Belirli bir şemanın tüm tabloları için AUTO_INCREMENT yüzdesinin "kullanımını" kontrol etme sorgusu ( bigint unsigned türünde olmayan sütunlar hariç ):

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

Ben de aynı şeyi arıyordum ve bir Helper sınıfının içinde statik bir yöntem oluşturarak sona erdi (benim durumumda App \ Helpers \ Database olarak adlandırdım).

Yöntem

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

Yöntemi çağırmak ve MySql AUTO_INCREMENT hizmetini almak için aşağıdakileri kullanmanız yeterlidir:

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

Umarım yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.