MySQL DROP सभी टेबल, विदेशी कुंजियों को अनदेखा करता है


402

वहाँ एक MySQL डेटाबेस से सभी तालिकाओं को छोड़ने का एक अच्छा आसान तरीका है, किसी भी विदेशी प्रमुख बाधाओं की अनदेखी करना जो वहां हो सकता है?


1
जब तक आपके पास बहुत सी अन्य संस्थाएं नहीं हैं, तब तक केवल DATP DATABASE और स्क्रैच से शुरू क्यों नहीं?
स्टुअर्टएलसी

161
उपयोगकर्ता प्रिविलेज को संरक्षित करने के लिए।
bcmcfc

5
मुझे बस एहसास हुआ कि इस बीच आपको डायोन ट्रूटर द्वारा एक उत्तर मिला जो मेरी तुलना में अधिक पूर्ण है और इसके बजाय उसे स्वीकार करने का सुझाव है। (बूंद सभी तालिकाओं को " भाग मेरा नहीं है)
चिक्कोडोरो

5
यदि आप phpMyAdmin स्थापित करने के लिए होता है तो फी यह सभी तालिकाओं का चयन करने और उन्हें छोड़ने के लिए आसान है।
उपयोगकर्ता

1
यह सच है लेकिन केवल संस्करण 4.x में phpMyAdmin के लिए। यदि आप सभी तालिकाओं का चयन करते हैं और Dropड्रॉपडाउन मेनू से चुनते हैं तो आप Foreign key checkचेकबॉक्स को अनचेक कर सकते हैं ।
जरमेली

जवाबों:


473

मैंने ड्रॉप स्टेटमेंट के जनरेट सेट को उपयोगी पाया, और इन ट्विक्स की सिफारिश की:

  1. इस तरह से उत्पन्न बूंदों को अपने डेटाबेस तक सीमित करें:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

नोट 1: यह DROP कथनों पर अमल नहीं करता है, यह सिर्फ आपको उनकी सूची देता है। आपको उन्हें निष्पादित करने के लिए अपने SQL इंजन में आउटपुट को काटने और पेस्ट करने की आवश्यकता होगी।

नोट 2: यदि आपके पास दृश्य हैं, तो आपको प्रत्येक DROP TABLE `VIEW_NAME`कथन को DROP VIEW `VIEW_NAME`मैन्युअल रूप से सही करना होगा।

  1. ध्यान दें, प्रति http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , झरना के साथ छोड़ना व्यर्थ / भ्रामक है:

"RESTRICT और CASCADE को पोर्टिंग को आसान बनाने की अनुमति है। MySQL 5.5 में, वे कुछ भी नहीं करते हैं।"

इसलिए, यदि आवश्यक हो तो काम करने के लिए ड्रॉप स्टेटमेंट के लिए:

SET FOREIGN_KEY_CHECKS = 0

यह संदर्भात्मक अखंडता जांचों को अक्षम कर देगा - इसलिए जब आपको अपनी ज़रूरत की बूंदों का प्रदर्शन किया जाता है, तो आप कुंजी चेकिंग को रीसेट करना चाहेंगे

SET FOREIGN_KEY_CHECKS = 1
  1. अंतिम निष्पादन जैसा दिखना चाहिए:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

एनबी: SELECT ईजी के आउटपुट का उपयोग करने के लिए, mysql -B विकल्प मदद कर सकता है।


6
@Timmm: मैंने अपने उत्तर में 3 ड्रॉप्स लिखे हैं - हालाँकि, यह उन्हें निष्पादित नहीं करता है। आपको उन्हें Stackoverflow से कॉपी करना है और उन्हें अपने MySQL कार्यक्षेत्र या जहाँ कहीं भी पेस्ट करना है। उपरोक्त चयन के साथ आपको "मुफ्त में" सभी मैचिंग ड्रॉप्स मिलते हैं। आपको बस उन्हें कॉपी-पेस्ट करना है।
चिकोडोरो

3
हाँ, मुझे पता है, लेकिन मैं इसे एक स्क्रिप्ट में उपयोग करना चाहता था। मैंने DROP DATABASE foo; CREATE DATABASE foo;जो किया वह वास्तव में कर रहा है , जो कि बहुत समान नहीं है, लेकिन मेरे लिए काम किया है।
टिमम्म

2
सुविधाजनक नहीं है जब सैकड़ों टेबल होते हैं, लेकिन डेटाबेस को फिर से बनाना एक विकल्प नहीं है तो कुछ भी बेहतर नहीं है।
निकोलस राउल

2
@ टिमम: यह फिर से देखते हुए - आप सही हैं, यह पूरी तरह से सवाल का जवाब नहीं देता है। जीन का उत्तर आशाजनक लग रहा है - यह DROP कथनों को स्वतः उत्पन्न करता है और उन्हें क्रियान्वित करता है, जबकि पहले और बाद में SET FOREIGN_KEY_CHECKS को ठीक से लागू करता है।
चिकोडोरो

1
टर्मिनल का उपयोग करता है, तो आप लिनक्स या मैक में हैं और यह अपने mysql खाता प्रकार के लिए प्रवेश के लिए काम करेंगे: mysql -u <उपयोगकर्ता नाम> -p तो अब आप पासवर्ड का चयन करें डेटाबेस तो दर्ज कर नष्ट तालिकाओं के लिए ऊपर कोड लिखने में प्रवेश मारा
ismnoiet

132

से http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys :

SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;

(ध्यान दें कि यह जवाब देता है कि मनमाने क्रम में तालिकाओं को ड्रॉप करने में सक्षम होने के लिए विदेशी कुंजी जांचों को कैसे निष्क्रिय किया जाए। यह जवाब नहीं देता है कि सभी मौजूदा तालिकाओं के लिए ड्रॉप-टेबल स्टेटमेंट को स्वचालित रूप से कैसे उत्पन्न किया जाए और उन्हें एक स्क्रिप्ट में निष्पादित किया जाए। जीन का जवाब। कर देता है।)


10
यदि आप MySQL वर्कबेंच का उपयोग करते हैं, तो आप बाएं कॉलम में सभी टेबल का चयन करके सभी नामों को टाइप करने से बच सकते हैं, राइट-क्लिक करें, फिर 'ड्रॉप टेबल' विकल्प। IT SQL को उत्पन्न करेगा जिसे आप SET FOREGIN_KEY_CHECKS स्टेटमेंट के बीच कॉपी और पेस्ट कर सकते हैं - शायद अन्य GUI के समान है।
क्रिस

धन्यवाद सहायक, और @ सुपर मददगार, एक उत्तर जोड़ना चाहिए
एंड्रयू

97

यहाँ SurlyDre की संग्रहीत प्रक्रिया को संशोधित किया गया है ताकि विदेशी कुंजियों को अनदेखा किया जा सके:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name 
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    SET FOREIGN_KEY_CHECKS = 0;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;
    SET FOREIGN_KEY_CHECKS = 1;
END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;

2
तालिकाओं पर काम करता है, विचारों को हटाने में विफल रहता है। फिर भी मेरी टाइपिंग को बड़े पैमाने पर कम किया :) thx।
क्रिसटाउनटाउन

7 साल बाद मैं कहूंगा कि आपको _tableNameएक बैकक्वॉट के साथ लपेटना चाहिए । अन्यथा यह कुछ तालिकाओं जैसे groupया अन्य कीवर्ड पर विफल हो जाएगा ।
शशिरो

विचारों का ख्याल रखें! तालिका का चयन करें_में से जानकारी_समेय। टैब्लेस जहां टेबल_सेहमा = स्कीमा () और तालिका_प्रकार = "आधार तालिका";
लॉरेंट बेलोइल

42

ऊपर प्रत्येक दृष्टिकोण में इस एक AFAICT की तुलना में बहुत अधिक कार्य शामिल हैं ...

( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql

2
क्यों नहीं बस एक फ़ाइल के माध्यम से जा रहा है, के mysqldumpलिए पाइप mysql?
रॉल्फ

2
@ रॉल्फ कोई विशेष कारण नहीं। अपने आप को बाहर करना।
स्काईलच

2
धन्यवाद, मैं पहले से ही था, कोष्ठक हटा दिया और पाइप्ड mysqldumpमें grepमें mysql, यह काम करता है। आपके समाधान के लिए फिर से धन्यवाद, यह अच्छा है।
रॉल्फ

5
यह एक विदेशी कुंजी बाधाओं को याद कर रहा है; मैंने आपके उत्तर के आधार पर यहाँ एक bash स्क्रिप्ट जोड़ी है: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger

sooooooooooooo स्मार्ट!
zx1986

25

से इस उत्तर ,

निष्पादित:

  use `dbName`; --your db name here
  SET FOREIGN_KEY_CHECKS = 0; 
  SET @tables = NULL;
  SET GROUP_CONCAT_MAX_LEN=32768;

  SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
  FROM   information_schema.tables 
  WHERE  table_schema = (SELECT DATABASE());
  SELECT IFNULL(@tables, '') INTO @tables;

  SET        @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
  PREPARE    stmt FROM @tables;
  EXECUTE    stmt;
  DEALLOCATE PREPARE stmt;
  SET        FOREIGN_KEY_CHECKS = 1;

यह वर्तमान में उपयोग में डेटाबेस से तालिकाओं को गिराता है। आप वर्तमान डेटाबेस का उपयोग करके सेट कर सकते हैं use


या अन्यथा, डायोन का स्वीकृत उत्तर सरल है, इसके अलावा आपको इसे दो बार निष्पादित करने की आवश्यकता है, पहला क्वेरी प्राप्त करने के लिए, और दूसरा क्वेरी निष्पादित करने के लिए। मैंने db और table नामों में विशेष अक्षरों से बचने के लिए कुछ मूर्खतापूर्ण बैक-टिक्स प्रदान किए।

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here

लघु और स्वच्छ समाधान। प्रक्रिया विकल्प की तुलना में बेहतर है।
राफेल रेनन पाचेको

16

यहाँ एक कर्सर आधारित समाधान है। किंडा लंबा लेकिन एकल SQL बैच के रूप में काम करता है:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name 
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;

END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;

2
अच्छा है, लेकिन यह दुर्भाग्य से विदेशी कुंजी नहीं संभालता है।
टिम्मम्म

11

तुम कर सकते हो:

select concat('drop table if exists ', table_name, ' cascade;')
  from information_schema.tables;

फिर उत्पन्न प्रश्नों को चलाएं। वे वर्तमान डेटाबेस पर हर एक तालिका को छोड़ देंगे।

यहाँdrop table कमांड पर कुछ मदद दी गई है।


उपर्युक्त उत्तर मानता है कि ||संघचालक होना तय है। अधिक विशेष रूप से, MySQL SQL मोड में है PIPES_AS_CONCAT। संदर्भ: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan

@Ionut: अच्छा! यह बात बताने के लिए धन्यवाद। के concatबजाय उपयोग करने के लिए कोड नमूना फिक्स्ड||
पाब्लो सांता क्रूज़

9

मैं इस बदलाव के साथ Dion Truter के उत्तर को कई तालिकाओं के साथ आसान बनाने के लिए आया था:

SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n', 
              GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
                           SEPARATOR ';\n'),
              ';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';

यह पूरी चीज़ को एक क्षेत्र में लौटाता है, इसलिए आप एक बार कॉपी कर सकते हैं और सभी तालिकाओं ( Copy Field Content (unquoted)कार्यक्षेत्र में उपयोग ) को हटा सकते हैं । यदि आपके पास बहुत सारी टेबल हैं, तो आप कुछ सीमाएँ मार सकते हैं GROUP_CONCAT()। यदि ऐसा है, तो अधिकतम लेन चर बढ़ाएँ (और max_allowed_packet, यदि आवश्यक हो)।


SET GROUP_CONCAT_MAX_LEN वह ट्रिक थी जिसकी मुझे आवश्यकता थी। मेरे पास एक स्क्रिप्ट थी जो काम कर रही थी, लेकिन हमेशा कुछ छंटनी की गई तालिका के नाम के साथ पहली बार विफल रही, और फिर दूसरी बार चलने पर सफलतापूर्वक समाप्त हुई। धन्यवाद!
द्वैत

8

विषय पर गुगली करना मुझे हमेशा इस SO प्रश्न पर लाता है इसलिए यहाँ mysql कोड काम कर रहा है जो BOTH तालिकाओं और दृश्यों को हटाता है:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    SET FOREIGN_KEY_CHECKS = 0;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
        SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);

        PREPARE stmt1 FROM @stmt_sql1;
        PREPARE stmt2 FROM @stmt_sql2;

        EXECUTE stmt1;
        EXECUTE stmt2;

        DEALLOCATE PREPARE stmt1;
        DEALLOCATE PREPARE stmt2;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;
    SET FOREIGN_KEY_CHECKS = 1;
END$$

DELIMITER ;

call drop_all_tables();

DROP PROCEDURE IF EXISTS `drop_all_tables`;

7

दिए गए डेटाबेस से सभी तालिकाओं को छोड़ने के लिए एक लाइनर:

echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"

इसे चलाने से डेटाबेस DATABASE_NAME की सभी तालिकाएँ गिर जाएँगी।

और इसके बारे में एक अच्छी बात यह है कि डेटाबेस का नाम केवल एक बार स्पष्ट रूप से लिखा गया है।


1
यह मेरे लिए काम करता है लेकिन, मुझे मैक-हाई सिएरा पर -I के साथ -i को बदलना पड़ा
अली

1
साभार @AliSelcuk दोनों -i और -I उबंटू पर मेरे लिए काम करता है, इसलिए मैं इसे बदलकर -I करूंगा ताकि इसके लिए macOS भी काम कर सके।
मार्शेन

1
बहुत उपयोगी है, धन्यवाद! मुझे mysql कमांड के लिए -pPASSWORD (-p और PASSWORD के बीच कोई स्थान नहीं) का उपयोग करके एक पासवर्ड पास करना था
माइक

6

यहाँ एक बैश स्क्रिप्ट के माध्यम से ऐसा करने का एक स्वचालित तरीका है:

host=$1
dbName=$2
user=$3
password=$4

if [ -z "$1" ]
then
    host="localhost"
fi

# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done

वास्तव में यह समाधान पसंद है लेकिन मैं यह नहीं देखता कि मेजबान चर का उपयोग कैसे किया जाता है। यह लूप के लिए किसी भी mysql कॉल में उपयोग नहीं किया जा रहा है।
मैथ्यू ज़ैकशेवस्की

1
क्षमा करें, इसे कमांड में डालने से चूक गए, इसे अपडेट कर दिया।
kfox

5

अगर linux में (या पाइपिंग, इको और grep को सपोर्ट करने वाला कोई भी सिस्टम) आप इसे एक लाइन से कर सकते हैं:

echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि यह तरीका तेज और सरल है।


2

Php में इसके रूप में आसान के रूप में:

$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');

$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');

$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
          FROM information_schema.tables
          WHERE table_schema = 'YOURDB'";

foreach($pdo->query($query) as $row) {
    $pdo->exec($row[0]);
}

$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');

बस अपने डेटाबेस के नाम के लिए YourDB बदलने के लिए याद है, और जाहिर है उपयोगकर्ता / पास।


2

एक लिनक्स शेल में जैसे बाश / zsh:

DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
  mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
  "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
   FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
  } | mysql "$DATABASE_TO_EMPTY"

यह कमांड उत्पन्न करेगा, फिर तुरंत उन्हें एक दूसरे क्लाइंट उदाहरण में पाइप करेगा जो तालिकाओं को हटा देगा।

चालाक बिट के पाठ्यक्रम यहाँ अन्य उत्तर से नकल है - मैं सिर्फ एक प्रति और pasteable एक लाइनर (ish) वास्तव में करना चाहता था कर काम ओपी चाहता था।

नोट निश्चित रूप से आप अपने क्रेडेंशियल्स, भी इन mysql आदेशों में (दो बार) में डालने के लिए, जब तक आप एक बहुत कम सुरक्षा सेटअप करना होगा। (या आप अपने क्रेडिट को शामिल करने के लिए अपने mysql कमांड को अन्य नाम दे सकते हैं।)


2

सभी तालिकाओं को गिराने के लिए जोनाथन वाट द्वारा की गई कुछ उपयोगी टिप्पणी को यहाँ रखें

MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL

यह मेरी मदद करता है और मुझे उम्मीद है कि यह उपयोगी हो सकता है


2

कमांड लाइन से एक लाइन के साथ डेटाबेस से सभी तालिकाओं को छोड़ें:

mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]

जहां [user_name], [पासवर्ड], [host_name] और [database_name] को एक वास्तविक डेटा (उपयोगकर्ता, पासवर्ड, होस्ट नाम, डेटाबेस नाम) के साथ बदलना होगा।


1

यह एक बहुत पुरानी पोस्ट है, लेकिन यहाँ किसी भी उत्तर ने वास्तव में मेरी राय में सवाल का जवाब नहीं दिया है, इसलिए मुझे आशा है कि मेरी पोस्ट लोगों की मदद करेगी!

मुझे यह समाधान एक और सवाल पर मिला, जो मेरे लिए बहुत अच्छा काम करता है:

mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done

यह वास्तव में डेटाबेस में आपके सभी तालिकाओं को खाली करेगा DB_NAME, और न केवल प्रदर्शित करेगाTRUNCATE कमांड लाइन ।

उम्मीद है की यह मदद करेगा!


उपयोगी है, लेकिन यह वास्तव में सवाल का जवाब नहीं है।
jrosell

1

@Dion Truter और @Wade विलियम्स द्वारा उत्तर पर बिल्डिंग, निम्नलिखित शेल स्क्रिप्ट सभी टेबल को गिरा देगी, पहले यह दिखाने के बाद कि यह क्या चलाने वाला है, और आपको Ctrl-C का उपयोग करने का मौका देता है।

#!/bin/bash

DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx

CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"

# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
    SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
    FROM information_schema.tables
    WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}

# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read

# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}

0

यह समाधान @SkyLeach उत्तर पर आधारित है, लेकिन विदेशी कुंजियों के साथ टेबल छोड़ने के समर्थन के साथ।

echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql


0

सरल और स्पष्ट (हो सकता है)।

एक फैंसी समाधान नहीं हो सकता है, लेकिन इसने मुझे काम किया और मेरा दिन बचाया।

सर्वर संस्करण के लिए काम किया: 5.6.38 MySQL सामुदायिक सर्वर (GPL)

मेरे द्वारा अनुसरण किए गए चरण:

 1. generate drop query using concat and group_concat.
 2. use database
 3. disable key constraint check
 4. copy the query generated from step 1
 5. enable key constraint check
 6. run show table

MySQL शेल

mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 

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


-1

मैं MSSQL सर्वर के साथ निम्नलिखित का उपयोग करता हूं:

if (DB_NAME() = 'YOUR_DATABASE') 
begin
    while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
    begin
         declare @sql nvarchar(2000)
         SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
         FROM information_schema.table_constraints
         WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
         exec (@sql)
         PRINT @sql
    end

    while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
    begin
         declare @sql2 nvarchar(2000)
         SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
         FROM INFORMATION_SCHEMA.TABLES
        exec (@sql2)
        PRINT @sql2
    end
end
else
    print('Only run this script on the development server!!!!')

अपने डेटाबेस के नाम के साथ Your_DATABASE बदलें या संपूर्ण IF स्टेटमेंट को हटा दें (मुझे अतिरिक्त सुरक्षा पसंद है)।


-7

सबसे अच्छा उपायमेरे लिए अब तक का

डेटाबेस का चयन करें -> राइट क्लिक -> कार्य -> ​​स्क्रिप्ट उत्पन्न करें - स्क्रिप्ट बनाने के लिए विज़ार्ड खोल देगा। सेट स्क्रिप्टिंग ऑप्शन में ऑब्जेक्ट चुनने के बाद एडवांस्ड बटन पर क्लिक करें । के तहत "स्क्रिप्ट ड्रॉप और बनाएँ" का चयन स्क्रिप्ट ड्रॉप

स्क्रिप्ट चलाएँ।


इसने लगभग काम किया लेकिन मैंने नीले बटन से पहले हरे बटन पर क्लिक किया और मुझे बाईं ओर एक बॉक्स मिला और मैंने रद्द कर दिया लेकिन फिर मैंने अपनी कॉफी पी ली और इसके बारे में भूल गया।
रॉल्फ

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