Mysql सम्मिलित क्वेरी से नया रिकॉर्ड प्राथमिक कुंजी ID प्राप्त करें?


249

ठीक है, तो मैं कहता हूं कि मैं INSERTअपनी एक टेबल में mysql कर रहा हूं और टेबल में कॉलम है item_idजो सेट है autoincrementऔर primary key

item_idउसी क्वेरी में नई जनरेट की गई प्राथमिक कुंजी के मूल्य को आउटपुट करने के लिए मुझे क्वेरी कैसे मिलेगी ?

वर्तमान में मैं आईडी को पुनः प्राप्त करने के लिए एक दूसरी क्वेरी चला रहा हूं, लेकिन यह शायद ही ऐसा लगता है कि यह अच्छा अभ्यास है क्योंकि यह गलत परिणाम उत्पन्न कर सकता है ...

यदि यह संभव नहीं है तो सही आईडी प्राप्त करने के लिए यह सुनिश्चित करने के लिए सबसे अच्छा अभ्यास क्या है?


1
इस तरह से INSERTक्वेरी से कुछ भी वापस करने का कोई तरीका नहीं है; आपको क्यों लगता है कि यह गलत परिणाम दे सकता है?
विस्फोट

4
ठीक है, अगर इस प्रक्रिया को 2 लोगों द्वारा अलग-अलग निष्पादित किया जाता है, तो आपको एक अतिव्यापी प्रक्रिया सूची मिल सकती है, जो मुझे लगता है - क्योंकि आपको 2 अलग-अलग प्रश्नों का निष्पादन करना है?
एमी नेविल


@JimFell हाँ यह मूल रूप से एक ही सवाल है, लेकिन यह एक सामान्य में बहुत बेहतर जवाब है
RozzA

1
Postgresql का उपयोग करें, फिर इस तरह का INSERT INTO table (col1, col2) VALUES (val1, val2) RETURNING आईडी या INSERT INTO तालिका (col1, col2) VALUES (val1, val2) RETURNING * या UPDATE तालिका SET col1 = val1, col1 = col2 = जैसे करें। WH कथन विवरण RETURNING id या UPDATE टेबल SET (col1, col2) = (val1, val2) WH कथन विवरण RETURNING id या UPDATE तालिका SET (col1, col2) = (val1, val2) WHERE कथन RETURNING *
gdarcan

जवाबों:


327

आपको LAST_INSERT_ID()फ़ंक्शन का उपयोग करने की आवश्यकता है : http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

उदाहरण के लिए:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

यह आपको आपके द्वारा डाली PRIMARY KEYगई अंतिम पंक्ति का मान वापस दिलाएगा:

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

तो द्वारा दिए गए मान LAST_INSERT_ID()प्रति उपयोगकर्ता है और अप्रभावित है कि सर्वर पर चल रहा हो सकता है अन्य प्रश्नों से अन्य उपयोगकर्ताओं से


8
हां लेकिन क्या होगा अगर अंतरिम (प्रक्रिया सूची में प्रश्नों के बीच) में कुछ और पंक्ति डाली गई है? क्या इन्सर्ट क्वेरी लिखने का कोई तरीका है ताकि वह इसे आउटपुट करे?
एमी नेविल

ठीक है, मैं देख रहा हूँ ... क्वेरी का अंतिम इंसर्ट आईडी तब भी दर्ज किया जाता है, भले ही वह परिणाम में लॉग न हो ... $ mysqli-> insert_id
एमी नेविल

27
यह आपको आपके द्वारा डाली PRIMARY KEYगई अंतिम पंक्ति का मान वापस दिलाएगा, क्योंकि यह प्रति कनेक्शन है - सर्वर से प्रत्येक कनेक्शन इसके लिए स्वयं का मूल्य बनाए रखेगा। मैंने इसे स्पष्ट करने के लिए उत्तर को अपडेट कर दिया है।
डंकन लॉक

इसलिए मान लीजिए कि 3 उपयोगकर्ताओं ने एक साथ अपने फॉर्म पोस्ट किए और मेरे डेटाबेस को उन्हें दर्ज करना है। मैं तालिका 2 में तालिका 1 के प्रत्येक नए बनाए गए आईडी के अनुरूप एक पंक्ति जोड़ना चाहता हूं। क्या संगामिति का ध्यान रखा गया है या क्या मुझे इसे PHP में मैन्युअल रूप से करना होगा, आने वाले डेटाबेस के लिए अनुरोध लिखें?
bad_keypoints

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

21

सावधान !! "LAST_INSERT_ID ()" अगर PHP के भीतर इस प्राथमिक कुंजी मान को वापस करने की कोशिश की जा रही है।

मुझे पता है कि इस थ्रेड को php टैग नहीं किया गया है, लेकिन जो कोई भी इस जवाब पर आया है, वह एक मानक स्क्रिप्ट mysql_query कॉल का उपयोग करके PHP स्क्रिप्टेड इन्सर्ट से MySQL इंसर्ट आईडी को देखने के लिए देख रहा है - यह काम नहीं करेगा और SQL त्रुटियों को कैप्चर किए बिना स्पष्ट नहीं है।

नई mysqli कई प्रश्नों का समर्थन करती है - जो कि LAST_INSERT_ID () वास्तव में मूल से दूसरी क्वेरी है।

अंतिम प्राथमिक कुंजी को पहचानने के लिए IMO का एक अलग चयन वैकल्पिक mysql_insert_id () फ़ंक्शन की तुलना में सुरक्षित है, जो पिछले INSERT ऑपरेशन से उत्पन्न AUTO_INCREMENT आईडी लौटाता है।


7
LAST_INSERT_IDएक प्रति-कनेक्शन MySQL फ़ंक्शन है। यदि आप अंतिम सम्मिलित आईडी के लिए क्वेरी करते हैं तो यह संभव है कि एक अलग कनेक्शन ने एक प्रदर्शन किया हो और आपके पास गलत आईडी होगी।
विस्फोट

@ExplosionPills mysql_insert_id()भी एक प्रति कनेक्शन के आधार पर काम करता है, लेकिन यह भी अजीब व्यवहार के रूप में यहाँ देखा ग्रस्त stackoverflow.com/a/897374/1305910 Cliffordlife द्वारा टिप्पणी में - कोई बात नहीं हम सभी का उपयोग कर किया जाना चाहिए थाmysqli
RozzA

क्या आप स्पष्ट कर सकते हैं कि जब आप काम करते हैं तो इसका क्या मतलब है?
जॉन ktejik

18

से LAST_INSERT_ID()प्रलेखन:

जो आईडी जनरेट की गई थी, वह सर्वर पर प्रति-कनेक्शन के आधार पर बनी हुई है

यदि आपके पास स्क्रिप्ट के दो अलग-अलग अनुरोध हैं, तो एक साथ वे एक-दूसरे को प्रभावित नहीं करेंगे ' LAST_INSERT_ID()(जब तक कि आप लगातार कनेक्शन का उपयोग नहीं कर रहे हैं)।


2
मुझे लगता है कि यह संदिग्ध है अगर आपकी टेबल पर एक ट्रिगर है जो किसी अन्य तालिका में सम्मिलित करता है .... LAST_INSERT_ID () अन्य तालिका का आईडी मान
लौटाएगा

15

यहाँ आप क्या देख रहे हैं !!!

select LAST_INSERT_ID()

यह SCOPE_IDENTITY()उपयोग किए जा रहे फ़ंक्शन का सबसे अच्छा विकल्प हैSQL Server

आपको यह भी ध्यान रखना होगा कि यह केवल तभी काम करेगा जब Last_INSERT_ID()आपकी Insertक्वेरी के बाद निकाल दिया जाए । यह क्वेरी स्कीमा में डाली गई आईडी को लौटाता है। आपको विशिष्ट तालिका की अंतिम सम्मिलित आईडी नहीं मिल सकती है।

अधिक जानकारी के लिए कृपया लिंक के माध्यम से जाएँ SQLServer फ़ंक्शन के बराबर SCOPE_IDENTITY () mySQL में?


6

यदि आपको पंक्ति डालने से पहले मूल्य की आवश्यकता है:

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

आप इसे एक प्रविष्टि में उपयोग कर सकते हैं:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);

1
यह एक अच्छा विचार नहीं लगता है? यदि 2 क्लाइंट उसी समय पर उस फ़ंक्शन को कॉल करते हैं, तो वे सोचेंगे कि वे एक ही आईडी डाल रहे हैं जब वास्तविकता में वे नहीं हैं .... कोई सम्मिलित करने पर थोड़ा धीमा हो जाएगा और इसे जानने के बिना अगली आईडी प्राप्त करेगा।
कारकर

5

आपको अपने क्वेरी परिणाम पर ये पैरामीटर प्राप्त होंगे:

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0

insertIdवास्तव में आप क्या जरूरत है।

(NodeJS-MySQL)


4

अगर अजगर में pymysql का उपयोग करते हैं, तो कर्सर से आप कर्सर का उपयोग कर सकते हैं


2

बस "$ last_id = mysqli_insert_id ($ कॉन) का उपयोग करें;"


2
मैं वास्तव में गूगल के लिए इस उत्तर के php संस्करण की तलाश में यहां ठोकर खाई, इसलिए मैंने इस उत्तर को वोट दिया। जबकि तकनीकी रूप से ओपी ने php के लिए नहीं कहा था, यह बहुत से लोगों के लिए सहायक हो सकता है जो यहाँ भी ठोकर खाते हैं।
फोटोग्राफर ब्रिट

बहुत बहुत धन्यवाद अर्नव! I
जुआनसेडानो

1

यदि आप PHP का उपयोग कर रहे हैं: एक पीडीओ ऑब्जेक्ट पर आप lastInsertId को सरल रूप से लागू कर सकते हैं अपनी प्रविष्टि के बाद विधि ।

अन्यथा LAST_INSERT_ID के साथ आप इस तरह मूल्य प्राप्त कर सकते हैं:SELECT LAST_INSERT_ID();



0

मैं सिर्फ PHP में इस पर अपना दृष्टिकोण साझा करना चाहता हूं, आप में से कुछ इसे एक कुशल तरीका नहीं मान सकते हैं लेकिन यह अन्य उपलब्ध विकल्पों की तुलना में 100 बेहतर है।

एक यादृच्छिक कुंजी उत्पन्न करें और इसे एक नई पंक्ति बनाते हुए तालिका में डालें। फिर आप प्राथमिक कुंजी को पुनः प्राप्त करने के लिए उस कुंजी का उपयोग कर सकते हैं। डेटा जोड़ने और अन्य सामान करने के लिए अपडेट का उपयोग करें।

इस तरह से एक पंक्ति को सुरक्षित करने में मदद मिलती है और सही प्राथमिक कुंजी होती है।

जब तक आपके पास कोई अन्य विकल्प न हो, मैं वास्तव में इसकी अनुशंसा नहीं करता।

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