Mysql में अगली ऑटो-इन्क्रीमेंट आईडी कैसे प्राप्त करें


114

इसे तालिका में सम्मिलित करने के लिए mysql में अगली आईडी कैसे प्राप्त करें

INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))

1
auto_incrementस्तंभ का उपयोग करें
knittl

क्या आप अगली आईडी या उस पंक्ति की आईडी चाहते हैं जिसे आप वर्तमान में सम्मिलित कर रहे हैं? अर्थात्, भुगतान कोड के अंत में आईडी उस पंक्ति की आईडी होना चाहिए जिसमें भुगतान कोड संग्रहीत है?
माइक

पंक्ति है कि मैं वर्तमान में डालने कर रहा हूँ की आईडी
faressoft

6
उस स्थिति में, जब आप उन्हें सम्मिलित करते हैं, तो उन्हें पुनः प्राप्त करते समय मूल्यों को संक्षिप्त करें। यह उस तरह से बहुत आसान है, और आप गलत आईडी प्राप्त करने से इनकार करते हैं, या अपडेट चलाने के लिए - सोचते हैं कि क्या होगा यदि आपके द्वारा डाली गई पंक्ति किसी अन्य क्लाइंट द्वारा अनुरोध की गई है, इससे पहले कि अपडेट को चलाने का मौका मिले: क्लाइंट अमान्य भुगतान कोड के साथ समाप्त होगा। कम ट्रैफ़िक सिस्टम पर, यह नहीं हो सकता है, लेकिन मुझे जोखिम लेने की बात नहीं दिखती है।
माइक

... या @binaryLV के अनुसार, संसाधन लॉकिंग समस्या का समाधान भी कर सकता है। देखें: dev.mysql.com/doc/refman/5.5/en/lock-tables.html
माइक

जवाबों:


12

LAST_INSERT_ID()अपनी SQL क्वेरी से उपयोग करें ।

या

आप mysql_insert_id()इसे PHP का उपयोग करके भी प्राप्त कर सकते हैं ।


13
@ सरफराज: सवाल यह था कि NEXT आईडी के बारे में LAST नहीं था जैसा कि आपने बताया LAST_INSERT_ID()
फेलिप परेरा

1
यदि पंक्तियों को तालिका में हटा दिया जाता है तो अधिकतम गलत होगा
पीटरचूला

बस '17 से एक नोट - mysql * फ़ंक्शन पदावनत किए गए हैं - ऊपर के साथ किया जा सकता हैmysqli_insert_id
treyBake

किसने इसे उत्तर के रूप में चिह्नित किया है? सवाल अगले डालने आईडी के बारे में पिछले नहीं है।
अमित शाह

253

आप उपयोग कर सकते हैं

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;

या यदि आप information_schema का उपयोग नहीं करना चाहते हैं तो आप इसका उपयोग कर सकते हैं

SHOW TABLE STATUS LIKE 'table_name'

पहले दो विकल्पों के लिए धन्यवाद .. लेकिन तीसरा सिर्फ पीएचपी से बुलाया गया नंबर दो है .. यकीन नहीं होता कि बड़े डेटाबेस पर तेजी से क्या होता है ...
जेरार्ड ओनली

1
@Gerardoneill ने इसे हटा दिया
ravi404

3
क्योंकि कैश का उपयोग डेटा को सूचना_सेश.नेट से पुनर्प्राप्त करने के लिए किया जाता है, यह समाधान mysql 8 के लिए अधिक काम नहीं करता है
ब्रूनो

1
@ ब्रूनो क्या आप एक संदर्भ पोस्ट कर सकते हैं?
मावेरिसक सिप

1
यह आधिकारिक डॉक स्थिति जिसे dev.mysql.com/doc/refman/8.0/en/…TABLES.AUTO_INCREMENT कैश्ड किया गया है । माईसकल ब्लॉग में इसके बारे में कई पोस्ट भी हैं, लेकिन उनके द्वारा उल्लिखित प्रणाली वैरिएबल पुरानी लगती है: mysqlserverteam.com/… mysqlserverteam.com/…
ब्रूनो

50

आप ऐसा करके अगला ऑटो-इन्क्रीमेंट मान प्राप्त कर सकते हैं:

SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'

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

देख: SHOW TABLE STATUS


5
मैंने इसे अस्वीकार नहीं किया, लेकिन अंतिम ऑटो वेतन वृद्धि मूल्य का उपयोग करने के प्रयास में समस्या यह है कि जब तक आप इसे उपयोग करने के लिए नहीं आते हैं, तब तक यह अंतिम नहीं हो सकता है - कोई फर्क नहीं पड़ता कि कितनी जल्दी चयन और बाद में INSERT किया जाता है।
माइक

@ माइक, अगर यह सिंगल क्वेरी में किया जाता है तो क्या होगा? कुछ पसंद है insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'? मैं after insertट्रिगर में अद्यतन का उपयोग करेगा और last_insert_id(), हालांकि ...
बाइनरीएलवी

1
@binaryLV: SELECT और INSERT के बीच जितना छोटा अंतर है, उतना ही छोटा मौका है कि मूल्य बदल जाएगा, लेकिन यह इसे पूरी तरह से खारिज नहीं करता है। डेटाबेस पर प्रति मिनट हजारों हिट के साथ एक प्रणाली की कल्पना करें - मूल्य में परिवर्तन होने की संभावना नाटकीय रूप से बढ़ जाती है। यदि यह एकल क्वेरी के रूप में किया जाता है, तो तालिका या पंक्ति लॉकिंग इसे रोक सकती है, लेकिन यह डेटाबेस इंजन के एक विशेष व्यवहार पर निर्भर है, जो अच्छी तरह से प्रलेखित नहीं हो सकता है। UPDATEअगर मैं भी होता तो मैं बाद में साथ जाता। लेकिन मैं केवल प्रदर्शन समय पर दोनों को सम्‍मिलित करूंगा, और सभी परेशानी को बचाऊंगा।
माइक

3
SHOW TABLE STATUSदेखने के लिए उम्मीद database nameके बाद FROMऔर 'table name pattern'बाद LIKE
x-yuri

2
क्योंकि एक कैश का उपयोग
ब्रूनो

15

यह MySQL डेटाबेस के लिए ऑटो वेतन वृद्धि मूल्य लौटाएगा और मैंने अन्य डेटाबेस के साथ जांच नहीं की। कृपया ध्यान दें कि यदि आप किसी अन्य डेटाबेस का उपयोग कर रहे हैं, तो क्वेरी सिंटैक्स भिन्न हो सकता है।

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = 'your_database_name';

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = database();

AUTO_INCREMENT से सेलेक्ट करें information_schema.tables जहाँ से table_name = 'your_table_name' और table_schema = 'your_database_name';
लेजे

10

शीर्ष उत्तर समाधान के लिए PHP MySQL_ का उपयोग करता है , मैंने सोचा कि मैं इसे प्राप्त करने के लिए एक अद्यतन PHP MySQLi_ समाधान साझा करूंगा । इस निर्वासन में कोई त्रुटि आउटपुट नहीं है!

$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();

echo $row['Auto_increment'];

एक तालिका में आने वाले अगले ऑटो वेतन वृद्धि को मारता है।


क्योंकि एक कैश का उपयोग
ब्रूनो

9

PHP में आप यह कोशिश कर सकते हैं:

$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;

या

$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];

5
पहली विधि के साथ ध्यान रखें यदि उच्चतम आईडी के साथ रिकॉर्ड गिरा दिया जाता है, तो आप उस आईडी के साथ एक नया रिकॉर्ड बनाएंगे, जिसका उपयोग किया गया है।
टॉम जेनकिंसन

और यदि पिछली कुंजी का उपयोग अन्य तालिकाओं में किया गया था और अभी भी वहां रखा गया है तो आप बहुत ही अजीब जादू के साथ समाप्त हो सकते हैं
तेबे

यदि आप पिछले सम्मिलित रिकॉर्ड को छोड़ देते हैं, तो पहली गलत रिटर्न आईडी
अली परसा

6

उपाय:

CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
  FOR EACH ROW
BEGIN

SELECT  AUTO_INCREMENT Into @xId
    FROM information_schema.tables
    WHERE 
    Table_SCHEMA ="DataBaseName" AND
    table_name = "payments";

SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);

END;

"DataBaseName" हमारे डेटा बेस का नाम है




3

सम्मिलित करते समय आप आईडी का उपयोग नहीं कर सकते, न ही आपको इसकी आवश्यकता है। जब आप उस रिकॉर्ड को डाल रहे हैं तो MySQL को आईडी का पता भी नहीं है। आप बस तालिका "sahf4d2fdd45"में सहेज सकते हैं payment_codeऔर उपयोग कर सकते हैं idऔर payment_codeबाद में।

अगर आपको आईडी बनाने के लिए वास्तव में आपके पेमेंट_कोड की आवश्यकता है तो आईडी जोड़ने के लिए डालने के बाद पंक्ति को अपडेट करें।


+1 इसे और अधिक स्पष्ट करने के लिए: यदि आप किसी कॉलम से 'नवीनतम' मान को हड़पते हैं, तो यह केवल सटीक मूल्य है जिसे आप उसे हड़पते हैं। जब आप उस मूल्य का उपयोग बाद में सम्मिलित करने के लिए करते हैं तो यह नवीनतम मान नहीं हो सकता है। एक ऑटो इंक्रीमेंट कॉलम के मामले में, हमेशा ऐसा मौका होता है कि उस समय के बीच एक और मूल्य जोड़ा जाता है जिसे आपने आईडी और उस समय को प्राप्त किया है जिसे आप कहीं और सम्मिलित करते हैं। यदि आप एक पंक्ति का उल्लेख कर रहे हैं जिसे आपने अभी डाला है, तो LAST_INSERT_ID () का उपयोग करना ठीक है। यदि आप एक अद्वितीय मूल्य सुनिश्चित करने की कोशिश कर रहे हैं, तो यह नहीं है।
माइक

@cularis, MySQL को अगली auto_increment id पता है, यह information_schema.tablesतालिका में सूचीबद्ध है ।
जोहान

1
@faressoft: यदि विचार में एक भुगतान कोड है जिसमें एक अद्वितीय स्ट्रिंग शामिल है और पंक्ति का आईडी जिसमें उस भुगतान कोड शामिल है, तो बस पंक्ति को पुनः प्राप्त करते समय दोनों को मिलाएं - या तो SELECT ... CONCAT(payment_code, id), या आपके एप्लिकेशन कोड में। आप SELECTएक में लपेट भी सकते हैं VIEW, ताकि आप हमेशा अपने ऐप से हर चयन में CONCAT की चिंता किए बिना, सही मूल्य वापस कर सकें।
माइक

3

आपको अगले वृद्धिशील आईडी की क्या आवश्यकता है?

MySQL प्रति तालिका में केवल एक ऑटो-इन्क्रिमेंट फ़ील्ड की अनुमति देता है और यह विशिष्टता की गारंटी देने के लिए प्राथमिक कुंजी भी होनी चाहिए।

ध्यान दें कि जब आपको अगली इन्सर्ट आईडी मिलती है तो यह तब उपलब्ध नहीं हो सकती है जब आप इसका उपयोग करते हैं क्योंकि आपके पास जो मूल्य होता है वह केवल उस लेनदेन के दायरे में होता है। इसलिए आपके डेटाबेस पर लोड के आधार पर, उस मूल्य का उपयोग पहले से ही किया जा सकता है जब अगला अनुरोध आता है।

मेरा सुझाव है कि आप यह सुनिश्चित करने के लिए अपने डिज़ाइन की समीक्षा करें कि आपको यह जानने की आवश्यकता नहीं है कि अगला असाइन करने के लिए कौन सा ऑटो-इंक्रीमेंट मान है


जिस तरह के एप्लिकेशन के लिए आईडी की जरूरत होती है, उसे मान लेना अच्छा नहीं है। ऐसे अनुप्रयोग हैं जैसे कि मैं इस समय काम कर रहा हूं जिसे अगली वृद्धिशील आईडी की आवश्यकता है और पुनर्प्राप्त मूल्य किसी अन्य स्क्रिप्ट को आवंटित किए जाने के खतरे में नहीं है।
JG एस्टोट

3

मैं सुझाव देता हूं कि आप जो कर रहे हैं उस पर पुनर्विचार करें। मैंने एक भी उपयोग के मामले का कभी अनुभव नहीं किया, जहां उस विशेष ज्ञान की आवश्यकता होती है। अगली आईडी एक बहुत ही विशेष कार्यान्वयन विवरण है और मैं इसे ACID सुरक्षित होने पर नहीं गिनूंगा।

अंतिम आईडी के साथ अपनी सम्मिलित पंक्ति को अपडेट करने वाला एक सरल लेनदेन करें:

BEGIN;

INSERT INTO payments (date, item, method)
     VALUES (NOW(), '1 Month', 'paypal');

UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
     WHERE id = LAST_INSERT_ID();

COMMIT;

मैं एक ऐसे उपयोग-मामले को बता सकता हूं, मैं एक उत्पादन मुद्दे का निदान करने की कोशिश कर रहा हूं, इसलिए मुझे यह पता लगाने की आवश्यकता है कि क्या तालिका में अंतिम पंक्ति वास्तव में अंतिम पंक्ति है या यदि उसके बाद कोई जोड़ा गया है जो किसी तरह हटा दिया गया है, तो तालिका इसमें एक auto_increment फ़ील्ड है, इसलिए इस जानकारी को पाकर मैं यह निष्कर्ष निकाल सकता हूं कि पंक्ति हटा दी गई या कभी नहीं जोड़ी गई।
उस्मान

1
हो सकता है कि यह आपके लिए काम करे, लेकिन मैं इस पर भरोसा नहीं करूंगा क्योंकि मुझे नहीं लगता कि आपकी कोई गारंटी है: dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html " जब AUTO_INCREMENT कॉलम मल्टीपल-कॉलम इंडेक्स का हिस्सा होता है), AUTO_INCREMENT मान फिर से उपयोग किए जाते हैं यदि आप किसी समूह में सबसे बड़ी AUTO_INCREMENT मान वाली पंक्ति हटाते हैं। "
मार्कस मल्कुश 21

धन्यवाद, उपयोगी जानकारी, आपके साझा लिंक के अनुसार भी auto_increment को मैन्युअल रूप से एक नंबर डालने पर रीसेट किया जा सकता है, इसलिए हाँ विश्वसनीय नहीं है।
उस्मान

2

ऐसा करने से पहले आपको MySQL से जुड़ना होगा और एक डेटाबेस का चयन करना होगा

$table_name = "myTable"; 
$query = mysql_query("SHOW TABLE STATUS WHERE name='$table_name'"); 
$row = mysql_fetch_array($query); 
$next_inc_value = $row["AUTO_INCREMENT"];  

2

"mysql_insert_id ()" का उपयोग करें। mysql_insert_id () अंतिम प्रदर्शन किए गए क्वेरी पर कार्य करता है, मान उत्पन्न करने वाले क्वेरी के तुरंत बाद mysql_insert_id () कॉल करना सुनिश्चित करें।

नीचे उपयोग के उदाहरण हैं:

<?php
    $link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

mysql_query("INSERT INTO mytable  VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
    ?>

मुझे उम्मीद है कि उदाहरण से ऊपर उपयोगी है।


धन्यवाद मुझे इसकी जानकारी है।
मि। जावेद मुल्तानी


1
SELECT id FROM `table` ORDER BY id DESC LIMIT 1

हालाँकि मुझे इसकी उत्पादकता पर संदेह है लेकिन यह 100% विश्वसनीय है


मैं भी मानता हूं कि यह सबसे सरल तरीका है। निश्चित नहीं है कि आप नीचे मतदान क्यों कर रहे थे, लेकिन मैं एक उतार चढ़ाव के साथ भरपाई करूंगा।
recurse

मैंने लेन-देन की आवश्यकता का उल्लेख नहीं किया है, यदि आप इसे लेनदेन के अंदर नहीं लपेटते हैं तो यह कोड घटिया है क्योंकि यह वास्तविक लोडिंग से मिलता है।
तेबे

1
यदि नवीनतम पंक्ति हटा दी गई हो तो क्या होगा? या कई नवीनतम पंक्तियों को हटा दिया गया है?
लियाम डब्ल्यू

जब तक आप इसे स्पष्ट रूप से निर्दिष्ट नहीं करते हैं तब तक गैर-जारी, मुक्त कुंजी का उपयोग नहीं किया जाता है
Tebe

1

ravi404 के उत्तर का उपयोग करना:

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
    RETURNS BIGINT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

    DECLARE Value BIGINT;

    SELECT
        AUTO_INCREMENT INTO Value
    FROM
        information_schema.tables
    WHERE
        table_name = TableName AND
        table_schema = DATABASE();

    RETURN Value;

END

SHA1 हैश बनाने के लिए अपनी सम्मिलित क्वेरी में उपयोग करना। पूर्व .:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( getAutoincrementalNextval ('document') ),
    'Title',
    'Body'
);

क्या यह हमेशा काम करता है? यदि एक ही समय में दो आवेषण होते हैं तो क्या कोई दौड़ की स्थिति है?
Jmons

0

यदि आपका ऑटिऑनमेंट ऑफ़सेट 1 नहीं है, तो @ ravi404 का सुधार:

SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1) 
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );

( auto_increment-1): db इंजन 1 के ऑफ़सेट पर विचार करता है। इसलिए आपको इस धारणा को खोदने की ज़रूरत है, फिर @@ auto_increment_offset, या 1 के लिए डिफ़ॉल्ट मान जोड़ें: IFNULL (@@ auto -increment_offset, 1)


0

मेरे लिए यह काम करता है, और सरल दिखता है:

 $auto_inc_db = mysql_query("SELECT * FROM my_table_name  ORDER BY  id  ASC ");
 while($auto_inc_result = mysql_fetch_array($auto_inc_db))
 {
 $last_id = $auto_inc_result['id'];
 }
 $next_id = ($last_id+1);


 echo $next_id;//this is the new id, if auto increment is on

$last_idजब आप बस कर सकते हैं, तो दोहराए जाने के लिए अनावश्यक रूप से निर्दिष्ट करें DESC। आपके whileब्लॉक ने बेकार काम का भार उठाया।
Tiv

हाँ, ठीक है ... मैंने महसूस किया है कि यह सही नहीं है ... :( अंत में आईडी को दोहरा सकते हैं, अगर इसे पहले हटा दिया गया था ... :(
Toncsiking

0

यदि कोई सही AUTO_INCREMENT नहीं लौटाता है, तो कोशिश करें:

ANALYZE TABLE `my_table`;
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE (TABLE_NAME = 'my_table');

तालिका में यह स्पष्ट कैश, बी.डी.

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