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.