MySQL में कई तालिकाओं से कैसे हटाएं?


116

मैं एक बार में कुछ तालिकाओं से हटाने की कोशिश कर रहा हूं। मैंने थोड़ा शोध किया है, और इसके साथ आया हूं

DELETE FROM `pets` p,
            `pets_activities` pa
      WHERE p.`order` > :order
        AND p.`pet_id` = :pet_id
        AND pa.`id` = p.`pet_id`

हालाँकि, मुझे यह त्रुटि मिल रही है

अनिर्दिष्ट Database_Exception [1064]: आपके SQL सिंटैक्स में एक त्रुटि है; मैनुअल की जाँच करें जो आपके MySQL सर्वर संस्करण के लिए 'p, pets_activitiespa ... के निकट उपयोग करने के लिए सही सिंटैक्स से मेल खाती है ...

मैंने पहले कभी एक क्रॉस टेबल डिलीट नहीं किया है, इसलिए मैं अनुभवहीन हूं और अभी के लिए अटका हुआ हूं!

मैं क्या गलत कर रहा हूं?

जवाबों:


204

कथन JOINमें उपयोग करें DELETE

DELETE p, pa
      FROM pets p
      JOIN pets_activities pa ON pa.id = p.pet_id
     WHERE p.order > :order
       AND p.pet_id = :pet_id

वैकल्पिक रूप से आप उपयोग कर सकते हैं ...

DELETE pa
      FROM pets_activities pa
      JOIN pets p ON pa.id = p.pet_id
 WHERE p.order > :order
   AND p.pet_id = :pet_id

... से ही हटाना है pets_activities

देखें इस

एकल तालिका हटाता के लिए, अभी तक रेफेरेंन्शिअल सत्यनिष्ठा के साथ, वहाँ के साथ क्या कर के अन्य तरीके हैं EXISTS, NOT EXISTS, IN, NOT INऔर आदि लेकिन इससे पहले कि तुम कहाँ जो टेबल उपनाम वाले को नष्ट करने से निर्दिष्ट ऊपर एक FROMखंड में कुछ बहुत तंग की आप बाहर निकल सकते हैं अधिक आसानी से धब्बे। मैं EXISTS99% मामलों में पहुंचता हूं और फिर 1% है जहां यह MySQL सिंटैक्स दिन लेता है।


7
मैंने 6 बड़ी तालिकाओं (~ 15k पंक्तियों के बारे में सभी को शामिल करने) के साथ इस "सभी क्वेरी में हटाएं" की कोशिश की और 6 तालिकाओं में 63 पंक्तियों को हटाने के लिए 155 सेकंड का समय लिया: O
क्लेमेन तुषार

1
@ कैडमैन यह असली सही जवाब है; इसका उपयोग करने के खिलाफ तर्क हो सकते हैं, लेकिन यह अवसर पर बहुत उपयोगी है
साइमन क्रिश्चियन

1
+1 मैं सहमत हूं कि यह वास्तविक सही उत्तर में है, क्योंकि प्रश्न "आपको" नहीं होना चाहिए, लेकिन "कैसे" होना चाहिए। हालाँकि, मुझे 1% के बारे में सुनने में दिलचस्पी होगी क्योंकि मैं एक भी स्थिति के बारे में नहीं सोच सकता जहाँ यह पसंद किया जाएगा।
एरिक रॉबर्टसन

2
@techouse, क्या आपने शामिल किया और सूचकांकों पर फ़िल्टर किया? 15k x 15k x 15k x 15k 15k x 15k 11 मिलियन है। क्या एक SELECTसमान रूप से लंबा था?
पॉल ड्रेपर

6
आप LEFT JOIN का भी उपयोग कर सकते हैं, जो कि उपयोगी है अगर दूसरी तालिका में कोई मिलान प्रविष्टियाँ नहीं थीं, तो कुछ भी नहीं हटाया जाएगा।
लेक्सिब0

20

चूंकि यह एक साधारण माता-पिता / बच्चे के बीच का संबंध प्रतीत होता है petsऔर pets_activities, आप अपने विदेशी कुंजी अवरोध को दूर करने वाले हथकड़ी के साथ बनाना बेहतर होगा।

इस तरह, जब कोई petsपंक्ति हटाई जाती है, तो pets_activitiesउससे जुड़ी पंक्तियाँ स्वचालित रूप से भी हटा दी जाती हैं।

फिर आपकी क्वेरी सरल हो जाती है:

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id

3
@ एरिक, बशर्ते आपने संदर्भात्मक अखंडता स्थापित की है, कैस्केडिंग डिलीट अपने आप ही डिलीट होने से अधिक परेशानी का कारण नहीं बन सकता है। हम पहले से ही जानते हैं कि मानचित्रण paके pकारण एक उचित बच्चा है id/pet_id
पैक्सडीब्लो

14
ठीक है, आप लोगों के अपने विचार हैं लेकिन ऐसा लगता है कि आप डीबीएमएस की शक्ति को बहुत कम कर रहे हैं। कैस्केडिंग डिलीट डेटा प्रबंधन का एक हिस्सा है जो ट्रिगर, संग्रहीत प्रक्रियाओं या बाधाओं के रूप में है और वे केवल खतरनाक हैं यदि आप नहीं जानते कि आप क्या कर रहे हैं। फिर भी, मैं इस बिंदु पर बहस नहीं करूंगा, हमें सिर्फ असहमत होने के लिए सहमत होना पड़ेगा।
पैक्सडीब्लो

8
एरिक, अब आपने मेरी रुचि बढ़ा दी है। आप बिना किसी बाधा के डेटाबेस में डेटा अखंडता कैसे सुनिश्चित करते हैं?
पैक्सिडाब्लो

4
@ एरिक ने कहा, "मैं ट्रिगर्स, संग्रहीत प्रक्रियाओं या बाधाओं का भी उपयोग नहीं करता हूं।" आह, आप एक्सेल का उपयोग करें। :-)
james.garriss

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

14

इसे इस्तेमाल करो

DELETE FROM `articles`, `comments` 
USING `articles`,`comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

या

DELETE `articles`, `comments` 
FROM `articles`, `comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

1
इस का उपयोग करने के लिए एक अच्छा संदर्भ मिला और कुछ अन्य विकल्प mysqltutorial.org/mysql-delete-statement.aspx
Mavelo

3

मेरे पास इस समय परीक्षण करने के लिए mysql डेटाबेस नहीं है, लेकिन क्या आपने यह निर्दिष्ट करने की कोशिश की है कि खंड से पहले क्या हटाना है? उदाहरण के लिए:

DELETE p, pa FROM `pets` p,
        `pets_activities` pa
  WHERE p.`order` > :order
    AND p.`pet_id` = :pet_id
    AND pa.`id` = p.`pet_id`

मुझे लगता है कि आपने जो वाक्यविन्यास का उपयोग किया है वह mysql के नए संस्करणों तक सीमित है।


1
हालांकि, उस क्वेरी को सफलतापूर्वक निष्पादित किया गया था, लेकिन उसने कोई भी पंक्तियों को नहीं हटाया (लेकिन मेरा मानना ​​है कि यह होना चाहिए)।
एलेक्स

2

सिंटैक्स मुझे सही लगता है ... इसे उपयोग करने के लिए बदलने की कोशिश करें INNER JOIN...

इस पर एक नजर ।


7
बहुत बुरा आप वास्तविक समाधान शामिल नहीं है, क्योंकि लिंक सही है!
मायक्रोस

1

2017 में इसे पढ़ने वाले किसी भी व्यक्ति के लिए, मैंने ऐसा ही कुछ किया है।

DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND 
pets.`pet_id` = :pet_id

आमतौर पर, कई तालिकाओं से पंक्तियों को हटाने के लिए, मैं जो सिंटैक्स का पालन करता हूं, वह नीचे दिया गया है। समाधान एक धारणा पर आधारित है कि दोनों तालिकाओं के बीच कुछ संबंध है।

DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]

1

मुझे यह लेख मिला, जिसमें दिखाया गया है कि अच्छी व्याख्या के साथ MySQL DELETE JOIN स्टेटमेंट का उपयोग करके कई तालिकाओं से डेटा को कैसे हटाया जाए ।

यहां छवि विवरण दर्ज करें

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