"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > डीबी में एक पंक्ति डालें जो प्राथमिक कुंजी या अद्वितीय बाधाओं का उपयोग नहीं करती है

डीबी में एक पंक्ति डालें जो प्राथमिक कुंजी या अद्वितीय बाधाओं का उपयोग नहीं करती है

2024-11-08 को प्रकाशित
ब्राउज़ करें:129

Upsert a row in a DB that doesn

एक प्रोग्रामर के रूप में अपने 7 साल के करियर के दौरान, मैंने ज्यादातर समय ORM के माध्यम से SQL के साथ इंटरैक्ट किया है। लारवेल के एलोक्वेंट ओआरएम की एक विशेषता जो मुझे विशेष रूप से उपयोगी लगती है वह है इसकी updateOrInsert() विधि:

DB::table('posts')
    ->updateOrInsert(
        ['slug' => 'about'], // matching condition
        ['content' => 'Like and subscribe'] // created or updated values
    );

उपरोक्त उदाहरण में, एलोक्वेंट पोस्ट तालिका में एक पंक्ति की तलाश करेगा जहां स्लग "अबाउट" के बराबर है। यदि उस स्लग के साथ कोई पंक्ति मौजूद है, तो एलोक्वेंट उस पंक्ति की सामग्री को "पसंद करें और सदस्यता लें" में अपडेट कर देगा। यदि उस स्लग के साथ एक पंक्ति नहीं मौजूद है, तो एलोक्वेंट "अबाउट" के स्लग और "लाइक एंड सब्सक्राइब" की सामग्री के साथ एक नई पंक्ति बनाएगा।

समस्या: कोई प्राथमिक कुंजी या अद्वितीय बाधा नहीं

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

यदि पोस्ट_नाम प्राथमिक कुंजी होती, तो हम रिप्लेस स्टेटमेंट का उपयोग करके एलोक्वेंट की createOrUpdate() विधि के समान कुछ हासिल कर सकते थे, लेकिन पोस्ट_नाम प्राथमिक कुंजी नहीं है।

यदि पोस्ट_नाम में कोई अद्वितीय बाधा है, तो हम INSERT ... ON DUPLICATE KEY UPDATE स्टेटमेंट का उपयोग करके एलोक्वेंट की createOrUpdate() विधि के समान कुछ पूरा कर सकते हैं, लेकिन पोस्ट_नाम में कोई अद्वितीय बाधा नहीं है।

आह, वर्डप्रेस की खुशियाँ।

मैंने MySQL के IF स्टेटमेंट पर गौर किया, लेकिन IF स्टेटमेंट केवल संग्रहीत प्रक्रियाओं, ट्रिगर्स और फ़ंक्शंस में काम करता है। मैं SQL फ़ाइल में संग्रहीत कार्यविधियाँ नहीं बनाना चाहता था जिसे मैं नई साइट के डेटाबेस में आयात करूँगा, इसलिए मुझे अन्य विकल्पों की खोज करनी पड़ी।

समाधान: 2 कथन

शुद्ध एसक्यूएल में एलोक्वेंट की अपडेटऑरइंसर्ट() की कार्यक्षमता का अनुकरण करने के लिए मुझे जो सबसे सरल समाधान मिल सका, वह समस्या को दो टुकड़ों में तोड़ना था:

  1. किसी भी मौजूदा पंक्ति को मिलान वाले स्लग के साथ अपडेट करें।
  2. यदि मेल खाते स्लग वाली कोई पंक्ति नहीं है तो एक नई पंक्ति बनाएं।

व्यवहार में ऐसा दिखता है:

-- Update the post if it already exists.

UPDATE wp_posts
SET post_type = 'page',
    post_title = 'About',
    post_content = 'Like and subscribe'
WHERE post_name = 'about';

-- Create a new post if it does not exist.

INSERT INTO wp_posts (post_name, post_type, post_title, post_content)
SELECT 'about', 'page', 'About', 'Like and subscribe'
WHERE NOT EXISTS (
    SELECT 1
    FROM wp_posts
    WHERE post_name = 'about'
);

नोट: यह उदाहरण संक्षिप्तता और स्पष्टता के लिए वर्डप्रेस के कई आवश्यक wp_posts कॉलम को छोड़ देता है।

INSERT... SELECT कथन के बारे में सीखना मेरे लिए "अहा" क्षण था। इसका उद्देश्य एक साथ कई प्रविष्टियाँ करने के लिए किसी अन्य तालिका से क्वेरी के परिणामों का उपयोग करना है। हालाँकि, आप अपने स्वयं के मान प्रदान करके SQL की क्षमताओं का उपयोग और दुरुपयोग कर सकते हैं और केवल तभी सम्मिलित कर सकते हैं जब "about" के पोस्ट_नाम वाला कोई पोस्ट मौजूद न हो।

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

विज्ञप्ति वक्तव्य इस लेख को इस पर पुन: पेश किया गया है: https://dev.to/tylerlwsmith/upsert-a-hrow-n-a-dab-that-doesnt-use-primary-kys-or-unique-constraints-2jnl?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए अध्ययन करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3