2010-07-26 19 views
85

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

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

हालांकि साथ आया था, मैं इस त्रुटि हो रही है

Uncaught Database_Exception [1064]: आप अपने एसक्यूएल वाक्य रचना में एक त्रुटि है, जाँच के मैनुअल है कि सही वाक्य रचना के पास 'पी, pets_activities पा उपयोग करने के लिए अपने सर्वर संस्करण से मेल खाती है ...

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

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

उत्तर

153

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

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

से हटाने के लिए

देखें http://dev.mysql.com/doc/refman/5.0/en/delete.html

के लिए एकल तालिका हटाता है, अभी तक रेफेरेंन्शिअल सत्यनिष्ठा के साथ, EXISTS, EXISTS, IN, NOT IN, आदि के साथ करने के अन्य तरीके हैं, लेकिन उपरोक्त में से एक जहां आप निर्दिष्ट करते हैं कि कौन से तालिकाओं को हटाने के लिए फोरम क्लॉज से पहले उपनाम आपको कुछ सुंदर तंग स्पॉट्स से अधिक आसानी से निकाल सकता है। मैं 99% मामलों में एक EXISTS तक पहुंचने लगता हूं और फिर 1% है जहां यह MySQL वाक्यविन्यास दिन लेता है।

+5

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

+1

@cadman यह वास्तविक सही उत्तर है; इसका उपयोग करने के खिलाफ तर्क हो सकते हैं, लेकिन यह –

+1

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

1

वाक्य रचना मेरे लिए सही लग रहा है ... अंदरूनी शामिल हों उपयोग करने के लिए इसे बदलने के लिए प्रयास करें ...

इस पर एक नज़र डालें: http://www.electrictoolbox.com/article/mysql/cross-table-delete/

+4

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

17

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

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

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

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

हटाएं कैस्केड भयानक दुर्घटनाओं को आमंत्रित कर रहे हैं। –

+0

धन्यवाद पक्सडीब्लो, मुझे यकीन नहीं है कि यह अभी तक MySQL में कैसे करें लेकिन मैं इसे मानूंगा। – alex

+2

@Erick, बशर्ते आपने रेफरेंशियल अखंडता स्थापित की हो, कैस्केडिंग डिलीट्स स्वयं को हटाने से ज्यादा परेशानी नहीं कर सकती है। हम पहले से ही जानते हैं कि 'pa'' id' pet_id' मैपिंग के कारण 'p' का उचित बच्चा है। – paxdiablo

2

मैं इस समय पर परीक्षण करने के लिए एक 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

उस क्वेरी ने सफलतापूर्वक निष्पादित किया, हालांकि, उसने किसी भी पंक्ति को नहीं हटाया (लेकिन मुझे विश्वास है कि यह होना चाहिए)। – alex

12

उपयोग इस

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 
+0

नाइस - जॉइन का उपयोग करने से बेहतर और आसान लगता है। यह सबसे अच्छा समाधान है जो मैं यहां देखता हूं .. धन्यवाद! – gnB

+1

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

0

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] 
संबंधित मुद्दे