SQL: उपसर्ग के साथ तालिकाओं को हटाना


जवाबों:


178

आप इसे केवल एक MySQL कमांड के साथ नहीं कर सकते हैं, हालांकि आप के लिए स्टेटमेंट बनाने के लिए MySQL का उपयोग कर सकते हैं:

MySQL शेल या PHPMyAdmin के माध्यम से, निम्नलिखित क्वेरी का उपयोग करें

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

यह एक DROP स्टेटमेंट जेनरेट करेगा जिसे आप टेबल को ड्रॉप करने के लिए कॉपी और एक्जिक्यूट कर सकते हैं।

संपादित करें: यहां एक अस्वीकरण - ऊपर दिया गया विवरण उस उपसर्ग के साथ सभी डेटाबेस में सभी तालिकाओं को छोड़ देगा। यदि आप इसे किसी विशिष्ट डेटाबेस तक सीमित करना चाहते हैं, तो इस तरह दिखने के लिए क्वेरी को संशोधित करें और अपने स्वयं के डेटाबेस_नाम के साथ डेटाबेस_नाम बदलें:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';

मेरे पास केवल एक डेटाबेस है, इसलिए मुझे 2 वें की आवश्यकता नहीं है।
डेनिज़ ज़ोइटमैन

4
@ElijahLynn सीमा स्रोत शायद GROUP_CONCAT की अधिकतम लंबाई के कारण है। आप इसे बढ़ा सकते हैं, उदाहरण के लिए यहाँ
आसफ डेविड

7
स्वयं पर ध्यान दें। अधिकतम चार अंक प्राप्त करें: SET
मोहम्मद जोरैद

2
कृपया ध्यान दें कि, कुछ मामलों में, तालिका के उपसर्ग नामों में अंडरस्कोर से बचना आवश्यक है[...] LIKE 'myprefix\_%';
मैगिक्टाल्गुई

1
यह कई डुप्लिकेट table_names लौटाता है। पंकज खुराना ने जो जवाब दिया वह बेहतर IMHO का काम करता है।
जेरेमी

37

पहले के कुछ उत्तर बहुत अच्छे थे। मैंने वेब पर अन्य उत्तरों से कुछ धारणाओं के साथ उनके विचारों को एक साथ खींचा है।

मुझे 'temp_' से शुरू होने वाली सभी तालिकाओं को हटाने की आवश्यकता है क्योंकि कुछ पुनरावृत्तियों के बाद मैं इस कोड के ब्लॉक के साथ आया:

-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = 'my_database'
                AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

मुझे आशा है कि यह अन्य MySQL / PHP प्रोग्रामर के लिए उपयोगी है।


1
यह बिल्कुल सही जवाब है। अन्य उत्तर कई चरणों का उपयोग करते हैं या इसे मैन्युअल रूप से करने की आवश्यकता होती है। पता नहीं कैसे इस जवाब में 4 साल के बाद अधिक वोट नहीं है!
gbe

25
show tables like 'prefix_%';

परिणामों को कॉपी करें और उन्हें एक पाठ संपादक में पेस्ट करें या क्वेरी को फ़ाइल में आउटपुट करें, अवांछित स्वरूपण को हटाने के लिए कुछ खोज और प्रतिस्थापन का उपयोग करें और अंत में \nएक अल्पविराम डालकर ;सामने की ओर ड्रॉप टेबल जोड़ें।

आपको कुछ ऐसा मिलेगा जो इस तरह दिखता है:

drop table myprefix_1, myprefix_2, myprefix_3;

1
का उपयोग करने के लिए webhost पर जानकारी_schema.tables तक पहुंच नहीं है, इसलिए यह धन्यवाद जाने का तरीका था!
फ्लोरेंट रूक्स

10

@ -re- मिलर समाधान अच्छा है लेकिन वहाँ भी बेहतर और थोड़ा अधिक पेशेवर है जो आपको एक बार में सभी को निष्पादित करने में मदद करेगा। अभी भी एक से अधिक कमांड की आवश्यकता होगी लेकिन यह समाधान आपको स्वचालित बिल्ड के लिए SQL का उपयोग करने की अनुमति देगा।

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES
    WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;

नोट: यह कोड प्लेटफ़ॉर्म डिपेंडेंट है, यह MySQL के लिए है, लेकिन निश्चित रूप से इसे मामूली बदलावों के साथ Postgre, Oracle और MS SQL के लिए लागू किया जा सकता है।


त्रुटि 1064 (42000): आपके SQL सिंटैक्स में कोई त्रुटि है; पंक्ति 1 ERROR 1243 (HY000) पर '@tbls' के पास उपयोग करने के लिए सही सिंटैक्स के लिए आपके MySQL सर्वर संस्करण से मेल खाती पुस्तिका की जाँच करें: अज्ञात तैयार विवरण हैंडलर (stmt) EXECUTE ERROR 1243 (HY000) को दिया गया: अज्ञात तैयार विवरण हैंडलर (stmt) DEPOCATE PREPARE को दिया गया
Roni

सिंटैक्स त्रुटि: 'डीआरईपी टेबल @tbls' से PREPARE stmt;
ledawg


3

मैं इस तरह से क्वेरी को संपादित करके तालिका को सफलतापूर्वक छोड़ता हूं

SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
           FROM information_schema.TABLES
          WHERE TABLE_SCHEMA = 'pandora'
            AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

यह एकमात्र ऐसा था जो मैंने पाया था कि विदेशी प्रमुख बाधाओं को संबोधित करते हुए एक ही शरण में पूरा ऑपरेशन किया था।
इवान मैटसन

2

आप MySQL के साथ एक कमांड में कर सकते हैं:

drop table myprefix_1, myprefix_2, myprefix_3;

आपको संभवतः कोड में तालिका सूची को गतिशील रूप से बनाना होगा।

एक वैकल्पिक दृष्टिकोण MySQL 5 के लिए सामान्य उद्देश्य दिनचर्या पुस्तकालय का उपयोग करना होगा ।


2

मैं सिर्फ वही एसक्यूएल पोस्ट करना चाहता था जिसका मैंने उपयोग किया है - यह शीर्ष 3 उत्तरों के मिश्रण का कुछ है:

SET GROUP_CONCAT_MAX_LEN=10000;

SET @del = (
    SELECT      CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
    FROM        information_schema.TABLES

    WHERE       TABLE_SCHEMA = 'database_name'
    AND         TABLE_NAME LIKE 'prefix_%'
);

PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

2

GROUP_CONCAT का उपयोग करते हुए बस एक और समाधान ताकि यह ड्रॉप ड्रॉप टेबल 1, टेबल 2, जैसे एक ड्रॉप क्वेरी को निष्पादित करेगा

SET @Drop_Stm = CONCAT('DROP TABLE ', (
      SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
      WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm;
DEALLOCATE PREPARE Stm;

1

मैंने पाया कि तैयार किए गए बयान मेरे लिए काम करने के लिए थोड़े पेचीदा थे, लेकिन GROUP_CONCAT_MAX_LENजब आपके पास बहुत सी टेबल होती हैं तो सेटिंग करना आवश्यक था। इसने mysql कमांड लाइन से कट-एंड-पेस्ट के साथ एक सरल तीन-चरण प्रक्रिया का परिणाम दिया जो मेरे लिए बहुत काम आया:

SET GROUP_CONCAT_MAX_LEN=10000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

फिर परिणामी लंबे DROP स्टेटमेंट को ध्यान से काटें और पेस्ट करें ।


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