किसी भी तालिका के लिए वर्तमान AUTO_INCREMENT मान प्राप्त करें


294

MySQL में टेबल के लिए मुझे वर्तमान AUTO_INCREMENT का मूल्य कैसे मिलेगा?


31
यह सवाल जरूरी नहीं कि एक डुप्लिकेट है। लिंक किया गया प्रश्न पंक्ति गणना के लिए पूछ रहा है, और स्वीकृत उत्तर केवल पंक्ति गणना, नहीं AUTO_INCREMENT - को प्राप्त करता है, जो एक पूर्णतया प्रश्न है।
मथाई

जवाबों:


568

आप इस क्वेरी का उपयोग करके सभी तालिका डेटा प्राप्त कर सकते हैं:

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()स्पष्ट डेटाबेस नाम के बजाय भी उपयोग कर सकते हैं ।
एम। सुलेमान

22
नोट: DATABASE () पूर्ण है यदि आपने USE DATABASE कमांड जारी नहीं की है
methai

5
क्या कोई कारण है जो आप नहीं कर सकते हैं SELECT MAX(id) FROM table_name?
ब्रायन

43
क्या होगा अगर आपने पिछले रिकॉर्ड को हटा दिया है? मैक्स आपको मौजूदा
ऑटो_इन्क्रिमेंट

3
क्या यह तालिका में नवीनतम AUTO_INCREMENT मूल्य देता है या nnext मान क्या होने जा रहा है?
sidx

18

मेरा मानना ​​है कि आप MySQL के LAST_INSERT_ID () फ़ंक्शन की तलाश कर रहे हैं । यदि कमांड लाइन में, बस निम्नलिखित चलाएं:

LAST_INSERT_ID();

आप एक चयनित क्वेरी के माध्यम से भी यह मान प्राप्त कर सकते हैं:

SELECT LAST_INSERT_ID();

3
इसे जोड़ने और अपेक्षा करने के लिए यह सबसे अच्छा विचार नहीं है, यह अगली पंक्ति की आईडी होगी। इस बीच एक और लेन-देन एक नई पंक्ति सम्मिलित कर सकता है और आप गलत आईडी का सही उपयोग करेंगे?
एग्री

आप सही हे। मुझे लगता है कि यह आपके द्वारा चलाए जा रहे पर्यावरण पर निर्भर करता है। यदि यह एक नियंत्रित परीक्षण वातावरण है, तो आप सबसे अधिक संभावना एक को जोड़ सकते हैं और सुरक्षित हो सकते हैं। सबसे अच्छा जवाब मिथाई द्वारा प्रदान किया गया था।
jvdub

2
सबसे अच्छा जवाब क्या है, यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं। यदि आप एक नई पंक्ति सम्मिलित करते हैं और आप बनाई गई आईडी जानना चाहते हैं, तो आपका उत्तर सबसे अच्छा उत्तर है, क्योंकि LAST_INSERT_ID () लेनदेन सुरक्षित है और यह सुनिश्चित करता है, आपको बनाई गई वस्तु के लिए आईडी मिलती है। मैंने आपके उत्तर को वोट दिया, लेकिन मैं 'इसे जोड़
दूंगा

25
LAST_INSERT_ID () प्रति कनेक्शन है। इसका मतलब है, यदि कोई अन्य प्रक्रिया आपके बाद तीन अतिरिक्त पंक्तियों को सम्मिलित करती है, तो आपका LAST_INSERT_ID () कॉल उनकी तुलना में अलग होगा। यह सवाल टेबल पर वर्तमान AUTO_INC वैल के लिए पूछ रहा है।
14

2
यदि अंतिम INSERT विवरण एक पंक्ति से अधिक डाला गया है, तो यह आपको गलत उत्तर देगा। MySQL प्रलेखन (जोर दिया गया): "LAST_INSERT_ID () हाल ही में निष्पादित INSERT कथन के परिणामस्वरूप AUTO_INCREMENT कॉलम के लिए सफलतापूर्वक स्वचालित रूप से पहली बार उत्पन्न मूल्य का प्रतिनिधित्व करते हुए 64-बिट मान लौटाता है ।" सहज ज्ञान युक्त! dev.mysql.com/doc/refman/5.6/en/…
चार्ली

15

यदि आप किसी क्वेरी में इसे प्राप्त करने के बजाय केवल संख्या जानना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

SHOW CREATE TABLE tablename;

आपको नीचे की ओर auto_increment देखना चाहिए


5
यदि आपकी तालिका में कोई पंक्तियाँ नहीं हैं, तो यह काम नहीं करता है और auto_increment चालू है 1
पचेरियर

6

भले ही मथाई आप मैन्युअल रूप से क्वेरी चलाते हैं, का उत्तर सही है, एक समस्या तब होती है जब 2 समवर्ती लेनदेन / कनेक्शन वास्तव में उत्पादन में रनटाइम पर इस उदाहरण को निष्पादित करते हैं (उदाहरण के लिए)।

केवल 2 कनेक्शन के साथ MySQL कार्यक्षेत्र में मैन्युअल रूप से आज़माया गया:

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 सम्मिलित करना त्रुटि में है: त्रुटि कोड: 1062. कुंजी 'प्राथमिक' के लिए '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'));

क्योंकि हम वास्तव में उस आईडी को अन्य तालिका में हड़पने / पुन: उपयोग करने या वापस करने के इच्छुक हैं!


2
अच्छे खर्च! धन्यवाद। अब यह स्पष्ट है कि हम क्यों उपयोग करना चाहते हैंlast_insert_id()
इम्तियाज

यह एक दिलचस्प परिदृश्य है, लेकिन मुझे नहीं लगता कि यह वास्तव में उस सवाल का जवाब देता है जो AUTO_INCREMENTमूल्य को पुनः प्राप्त करना है ।
--१ 'तक शेयर करें

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 के प्रतिशत "उपयोग" की जांच करने की क्वेरी: (टाइप बिगिन अहस्ताक्षरित कॉलम को छोड़कर ):

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

मैं उसी की तलाश कर रहा था और एक हेल्पर वर्ग के अंदर एक स्थिर विधि बनाकर समाप्त हो गया (मेरे मामले में मैंने इसे ऐप्पल हेल्पर्स डेटाबेस का नाम दिया)।

विधि

/**
 * 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');

आशा है ये मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.