MySQL, एक क्वेरी के साथ कई टेबल अपडेट करें


132

मेरे पास एक फ़ंक्शन है जो तीन तालिकाओं को अपडेट करता है, लेकिन मैं इसे करने के लिए तीन प्रश्नों का उपयोग करता हूं। मैं अच्छे अभ्यास के लिए अधिक सुविधाजनक दृष्टिकोण का उपयोग करना चाहता हूं।

मैं एक क्वेरी के साथ MySQL में कई टेबल कैसे अपडेट कर सकता हूं?


3
क्या आप उत्पन्न कोड का एक उदाहरण प्रदान कर सकते हैं? क्या तालिकाओं के बीच एक आम कुंजी है?
जोनाथन डे

जवाबों:


451

दो तालिकाओं का मामला लें, Booksऔर Orders। मामले में, हम के साथ एक विशेष क्रम में पुस्तकों की संख्या में वृद्धि Order.ID = 1002में Ordersमेज तो हम भी कम करने की जरूरत है कि में एक ही संख्या से हमारे स्टॉक में उपलब्ध पुस्तकों की कुल संख्या Booksतालिका।

UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity + 2,
    Books.InStock = Books.InStock - 2
WHERE
    Books.BookID = Orders.BookID
    AND Orders.OrderID = 1002;

यदि मैं SQL क्वेरी में "लिमिट" को शामिल करना चाहता हूं, तो क्या मुझे लिमिट 1 या लिमिट 2 कहना होगा?
Bluedayz

2
यह एक बनाम लेनदेन करने का क्या फायदा है? धन्यवाद!
पौलकोन

2
@paulkon, मेरा मानना ​​है कि लेन-देन का उपयोग करते समय, रोल-बैक के बाद से बहुत सारे ओवरहेड शामिल होते हैं, यदि लेनदेन में कोई भी प्रक्रिया विफल हो जाती है तो उपलब्ध होना चाहिए।
थिएज रिजेबेक

27
इस क्वेरी का उपयोग करते समय सामान्य चेतावनी। WHERE क्लॉज का मूल्यांकन प्रत्येक टेबल के लिए अलग से किया जाता है। Books.BookID = Orders.BookID बहुत महत्वपूर्ण है, इसके बिना पुस्तकें तालिका अद्यतन सभी पंक्तियों के लिए होगा और न केवल निर्दिष्ट आईडी वाली पंक्ति के लिए। कुछ सबक कठिन तरीके से सीखे जाते हैं, यह एक भयानक तरीके से सीखा गया था।
nheimann1

1
@ nheimann1 और यही कारण है कि मैं हमेशा लोगों को ANSI "इनर जॉइन" सिंटैक्स का उपयोग करने की सलाह देता हूं। उस स्थिति को भूल जाना आसान है और इसके बजाय एक पूर्ण कार्टेशियन जुड़ना चाहिए।
मुर्गी 4jesus

77
UPDATE t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
SET t1.a = 'something',
    t2.b = 42,
    t3.c = t2.c
WHERE t1.a = 'blah';

यह देखने के लिए कि यह क्या अद्यतन करने जा रहा है, आप इसे चुनिंदा कथन में बदल सकते हैं, जैसे:

SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c
FROM t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
WHERE t1.a = 'blah';

दूसरे उत्तर के समान सारणी का उपयोग करने वाला एक उदाहरण:

SELECT Books.BookID, Orders.OrderID,
    Orders.Quantity AS CurrentQuantity,
    Orders.Quantity + 2 AS NewQuantity,
    Books.InStock AS CurrentStock,
    Books.InStock - 2 AS NewStock
FROM Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
WHERE Orders.OrderID = 1002;

UPDATE Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
SET Orders.Quantity = Orders.Quantity + 2,
    Books.InStock = Books.InStock - 2
WHERE Orders.OrderID = 1002;

संपादित करें:

बस मनोरंजन के लिए, आइए कुछ और अधिक दिलचस्प जोड़ें।

मान लीजिए कि आपके पास booksऔर की एक तालिका है authors। आपके booksपास एक है author_id। लेकिन जब डेटाबेस को मूल रूप से बनाया गया था, तो कोई भी विदेशी कुंजी बाधाएं स्थापित नहीं की गई थीं और बाद में फ्रंट-एंड कोड में एक बग के कारण कुछ पुस्तकों को अमान्य author_ids के साथ जोड़ा गया था । एक डीबीए के रूप में आपको इन सभी के माध्यम से जाने की आवश्यकता नहीं है कि booksक्या author_idहोना चाहिए, यह जांचने के लिए, इसलिए निर्णय किया जाता है कि डेटा कैप्चरर्स booksसही को इंगित करने के लिए तय करेंगे authors। लेकिन हर एक के माध्यम से जाने के लिए बहुत सी किताबें हैं और चलिए आपको बताते हैं कि जिन लोगों के पास author_idएक वास्तविक के साथ मेल खाती authorहैं वे सही हैं। यह सिर्फ वही है जो कोई नहीं हैauthor_ids जो अमान्य हैं। उपयोगकर्ताओं के लिए पुस्तक विवरण को अपडेट करने के लिए पहले से ही एक इंटरफ़ेस है और डेवलपर्स केवल इस समस्या के लिए इसे बदलना नहीं चाहते हैं। लेकिन मौजूदा इंटरफ़ेस एक करता है INNER JOIN authors, इसलिए अमान्य लेखकों वाली सभी पुस्तकों को बाहर रखा गया है।

आप यह क्या कर सकते हैं: "अज्ञात लेखक" की तरह एक नकली लेखक रिकॉर्ड डालें। फिर author_idअज्ञात लेखक को इंगित करने के लिए सभी बुरे रिकॉर्ड्स को अपडेट करें । फिर डेटा कैप्चरर्स "अज्ञात लेखक" के लिए सेट किए गए लेखक के साथ सभी पुस्तकों की खोज कर सकते हैं, सही लेखक को देख सकते हैं और उन्हें ठीक कर सकते हैं।

अज्ञात लेखक को इंगित करने के लिए आप सभी बुरे रिकॉर्ड कैसे अपडेट करते हैं? इस तरह (अज्ञात लेखक का मान author_id99999 है):

UPDATE books
LEFT OUTER JOIN authors ON books.author_id = authors.id
SET books.author_id = 99999
WHERE authors.id IS NULL;

इसके बाद के संस्करण भी अपडेट हो जाएगा booksकि एक है NULL author_idअज्ञात लेखक को। यदि आप ऐसा नहीं चाहते हैं, तो बेशक आप जोड़ सकते हैं AND books.author_id IS NOT NULL


35

तुम भी एक क्वेरी के साथ ऐसा कर सकते हैं एक का उपयोग कर ऐसा भी शामिल है:

UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;

और फिर बस इस एक प्रश्न को भेजें। आप यहाँ जॉइन के बारे में और अधिक पढ़ सकते हैं: http://dev.mysql.com/doc/refman/5.0/en/join.html । आपके द्वारा यहां पढ़ी जा सकने वाली कई टेबल अपडेट पर ऑर्डर करने और सीमित करने के लिए कुछ प्रतिबंध भी हैं: http://dev.mysql.com/doc/refman/5.0/en/update.html (बस ctrl + f "join")।


यह कॉल करने के लिए थोड़ा उदार है कि "शामिल हों" ;-)
अंडरस्कोर_ड

2

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


मैं प्रक्रिया कहां लिखूंगा? क्या आप कृपया एक उदाहरण प्रदान कर सकते हैं?
एडम्स्की

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

2

जब आप कहते हैं कि कई प्रश्न हैं, तो क्या आपके पास कई SQL कथनों का मतलब है:

UPDATE table1 SET a=b WHERE c;
UPDATE table2 SET a=b WHERE d;
UPDATE table3 SET a=b WHERE e;

या कई क्वेरी फ़ंक्शन के रूप में कॉल करता है:

mySqlQuery(UPDATE table1 SET a=b WHERE c;)
mySqlQuery(UPDATE table2 SET a=b WHERE d;)
mySqlQuery(UPDATE table3 SET a=b WHERE e;)

पूर्व सभी को एक mySqlQuery कॉल का उपयोग करके किया जा सकता है, यदि आप जो हासिल करना चाहते हैं, बस निम्नलिखित तरीके से mySqlQuery फ़ंक्शन को कॉल करें:

mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)

यह एक mySqlQuery () कॉल के साथ सभी तीन प्रश्नों को निष्पादित करेगा।


mySqlQuery () एक कस्टम फ़ंक्शन या अंतर्निहित फ़ंक्शन है? मैं इसके बारे में और जानना चाहता हूं।
देबाशीष

3
व्यक्तिगत रूप से या एक से अधिक क्वेरी के रूप में तीन क्वेरी भेजने के बीच कोई महत्वपूर्ण अंतर नहीं है, सिवाय इसके कि अगर आपका क्वेरी फ़ंक्शन हर बार एक नया कनेक्शन खोलता है। सर्वर-साइड निष्पादन के दृष्टिकोण से, यह एक ही बात है
डंकन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.