इसे तालिका में सम्मिलित करने के लिए mysql में अगली आईडी कैसे प्राप्त करें
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
इसे तालिका में सम्मिलित करने के लिए mysql में अगली आईडी कैसे प्राप्त करें
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
जवाबों:
LAST_INSERT_ID()
अपनी SQL क्वेरी से उपयोग करें ।
या
आप mysql_insert_id()
इसे PHP का उपयोग करके भी प्राप्त कर सकते हैं ।
LAST_INSERT_ID()
।
mysqli_insert_id
आप उपयोग कर सकते हैं
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
या यदि आप information_schema का उपयोग नहीं करना चाहते हैं तो आप इसका उपयोग कर सकते हैं
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
कैश्ड किया गया है । माईसकल ब्लॉग में इसके बारे में कई पोस्ट भी हैं, लेकिन उनके द्वारा उल्लिखित प्रणाली वैरिएबल पुरानी लगती है: mysqlserverteam.com/… mysqlserverteam.com/…
आप ऐसा करके अगला ऑटो-इन्क्रीमेंट मान प्राप्त कर सकते हैं:
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
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? मैं after insert
ट्रिगर में अद्यतन का उपयोग करेगा और last_insert_id()
, हालांकि ...
UPDATE
अगर मैं भी होता तो मैं बाद में साथ जाता। लेकिन मैं केवल प्रदर्शन समय पर दोनों को सम्मिलित करूंगा, और सभी परेशानी को बचाऊंगा।
SHOW TABLE STATUS
देखने के लिए उम्मीद database name
के बाद FROM
और 'table name pattern'
बाद LIKE
।
यह 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();
शीर्ष उत्तर समाधान के लिए 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'];
एक तालिका में आने वाले अगले ऑटो वेतन वृद्धि को मारता है।
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'];
उपाय:
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" हमारे डेटा बेस का नाम है
आप mysql ट्रिगर का उपयोग कर सकते हैं
payment_code
में अपडेट करना after insert
सबसे अच्छा विकल्प लगता है।
सम्मिलित करते समय आप आईडी का उपयोग नहीं कर सकते, न ही आपको इसकी आवश्यकता है। जब आप उस रिकॉर्ड को डाल रहे हैं तो MySQL को आईडी का पता भी नहीं है। आप बस तालिका "sahf4d2fdd45"
में सहेज सकते हैं payment_code
और उपयोग कर सकते हैं id
और payment_code
बाद में।
अगर आपको आईडी बनाने के लिए वास्तव में आपके पेमेंट_कोड की आवश्यकता है तो आईडी जोड़ने के लिए डालने के बाद पंक्ति को अपडेट करें।
information_schema.tables
तालिका में सूचीबद्ध है ।
SELECT ... CONCAT(payment_code, id)
, या आपके एप्लिकेशन कोड में। आप SELECT
एक में लपेट भी सकते हैं VIEW
, ताकि आप हमेशा अपने ऐप से हर चयन में CONCAT की चिंता किए बिना, सही मूल्य वापस कर सकें।
आपको अगले वृद्धिशील आईडी की क्या आवश्यकता है?
MySQL प्रति तालिका में केवल एक ऑटो-इन्क्रिमेंट फ़ील्ड की अनुमति देता है और यह विशिष्टता की गारंटी देने के लिए प्राथमिक कुंजी भी होनी चाहिए।
ध्यान दें कि जब आपको अगली इन्सर्ट आईडी मिलती है तो यह तब उपलब्ध नहीं हो सकती है जब आप इसका उपयोग करते हैं क्योंकि आपके पास जो मूल्य होता है वह केवल उस लेनदेन के दायरे में होता है। इसलिए आपके डेटाबेस पर लोड के आधार पर, उस मूल्य का उपयोग पहले से ही किया जा सकता है जब अगला अनुरोध आता है।
मेरा सुझाव है कि आप यह सुनिश्चित करने के लिए अपने डिज़ाइन की समीक्षा करें कि आपको यह जानने की आवश्यकता नहीं है कि अगला असाइन करने के लिए कौन सा ऑटो-इंक्रीमेंट मान है
मैं सुझाव देता हूं कि आप जो कर रहे हैं उस पर पुनर्विचार करें। मैंने एक भी उपयोग के मामले का कभी अनुभव नहीं किया, जहां उस विशेष ज्ञान की आवश्यकता होती है। अगली आईडी एक बहुत ही विशेष कार्यान्वयन विवरण है और मैं इसे 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;
"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());
?>
मुझे उम्मीद है कि उदाहरण से ऊपर उपयोगी है।
mysql_insert_id();
बस :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
हालाँकि मुझे इसकी उत्पादकता पर संदेह है लेकिन यह 100% विश्वसनीय है
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'
);
यदि आपका ऑटिऑनमेंट ऑफ़सेट 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)
मेरे लिए यह काम करता है, और सरल दिखता है:
$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
ब्लॉक ने बेकार काम का भार उठाया।
auto_increment
स्तंभ का उपयोग करें