एक आदेश में एक MySQL डेटाबेस में सभी तालिकाओं को काटें?


347

क्या एक ऑपरेशन में डेटाबेस में सभी तालिकाओं को अलग करने के लिए एक क्वेरी (कमांड) है? मैं जानना चाहता हूं कि क्या मैं एक सिंगल क्वेरी के साथ ऐसा कर सकता हूं।


1
सभी तालिकाओं को छोटा करें? क्या आपका मतलब एक डेटाबेस में सभी तालिकाओं के सभी स्तंभों को काट देना है? इसमें कौन सी क्वेरी भाषा है? (जैसे SQL, MySQL, Oracle, Postgres, आदि)
Jay

मुझे यकीन नहीं है कि मैं ऐसा करने की सलाह दूंगा क्योंकि आप बहुत आसानी से खुद को मुसीबत में डाल सकते हैं। क्या कोई कारण है कि आप सिर्फ स्क्रिप्ट को काट-छाँट कर सकते हैं और स्क्रिप्ट चला सकते हैं?
ग्रेवॉरिक्सएक्स

धन्यवाद 4 जबाब लेकिन एकमात्र कारण को स्क्रिप्ट नहीं यह कम समय इतना के बारे में सोचा के चल रहा है runnind एक प्रश्न में mysql
देवांग

फिर इसकी mysql में..और क्वेरी का मतलब कुछ हद तक टेबल टेबल_नाम से मिलता-जुलता है..क्योंकि मैं अपनी क्वेरी में सभी टेबल्स की सभी पंक्तियों को एक क्वेरी में
अलग

आप एक कर्सर के साथ Information_Schema का उपयोग कर सकते हैं। MySql के बारे में निश्चित नहीं है, लेकिन इसे Information_Schema.Tables का समर्थन करना चाहिए
GrayWizardx

जवाबों:


340

ड्रॉप (यानी टेबल हटा दें)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

ट्रंकट (यानी खाली टेबल)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done

17
हाँ, साफ, ty। लेकिन आपको इसे -UUSER -pPASSWORD के साथ चलाने की आवश्यकता हो सकती है। अगर आपको FK withou cascade पर हटाना है तो भी आपको इसे कई बार चलाना पड़ सकता है।
mihaicc

47
यदि आप FK समस्याओं में भाग लेते हैं, जैसे " पैरेंट रो को डिलीट या अपडेट नहीं कर सकते हैं: एक विदेशी कुंजी बाधा विफल रहती है ", तो कमांड को संशोधित करके विदेशी कुंजी जांच को अक्षम करना सुनिश्चित करें:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.

24
हालांकि mysql क्लाइंट को लूप करने की कोई आवश्यकता नहीं है। इसे इस तरह से लूप से बाहर mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
निकालें

2
@TylerCollier आपको एक .my.cnf
फेलिक्स ईव

2
उपरोक्त उत्तर और टिप्पणियों के आधार पर, और क्योंकि वे मेरे लिए उम्मीद के मुताबिक काम नहीं करते थे, मैंने एक सरल बैश स्क्रिप्ट बनाई जो आप इसके लिए उपयोग कर सकते हैं। आप इसे यहां देख सकते हैं: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga

145

Mysql उदाहरण पर कई डेटाबेस तालिकाओं को काटें

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('db1_name','db2_name');

तालिकाओं को छोटा करने के लिए क्वेरी परिणाम का उपयोग करें

नोट: हो सकता है कि आपको यह त्रुटि मिलेगी:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

ऐसा तब होता है जब आपके द्वारा छोड़ी / छांटने की कोशिश कर रहे टेबल के लिए विदेशी कुंजियों के संदर्भ वाली टेबल होती हैं।

तालिकाओं को रौंदने से पहले आपको बस इतना करना है:

SET FOREIGN_KEY_CHECKS=0;

अपनी तालिकाओं को काटें और इसे वापस बदलें

SET FOREIGN_KEY_CHECKS=1;

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

5
अपदस्थ क्योंकि इस समाधान के लिए केवल डीबी पहुंच की आवश्यकता है न कि एसएसएच एक्सेस की। इसके अलावा यह ओएस-स्वतंत्र है।
मस्ताज़ी

@ मस्तजी के पास कुछ सवाल हैं: 1. "table_schema" क्या है? क्या यह स्कीमा नाम से खड़ा है? 2. TABLE_NAME किसके लिए है? क्या यह उन तालिकाओं के लिए खड़ा है जिन्हें हटाया जाना चाहिए? 3. क्या मुझे "(db1_name ',' db2_name ')" जैसे टिन को हटाए जाने वाले टेबल को लंबा लिखना चाहिए? "
AAEM

@ केवल आवश्यक प्रतिस्थापन की आवश्यकता है कि आपको अपने डेटाबेस के नाम के साथ db1_name और db2_name को बदलना होगा। फिर आपको इस क्वेरी के परिणामों को कॉपी करना होगा, और उन्हें नए mysql क्वेरी के रूप में पेस्ट करना होगा और उन्हें निष्पादित करना होगा। INFORMATION_SCHEMA एक अंतर्निहित स्कीमा है जो प्रत्येक MySQL इंस्टॉलेशन में पहले से इंस्टॉल आता है और आपके डेटाबेस के बारे में जानकारी रखता है, इसे स्पर्श न करें या आपका MySQL गलत व्यवहार करना शुरू कर देगा :-) table_schema और table_name "TABLES" नामक तालिका के कॉलम हैं INFORMATION_SCHEMA
mastazi

"db_name" द्वारा, आप स्कीमा के नाम का मतलब है? मेरे पास केवल 1 स्कीमा है जिसे मैं उसके टेबल डेटा को हटाना चाहता
हूं

67

इस तरह से phpMyAdmin का उपयोग करें:

डेटाबेस देखें => सभी जांचें (तालिकाओं) => खाली

यदि आप विदेशी कुंजी चेक को अनदेखा करना चाहते हैं, तो आप उस बॉक्स को अनचेक कर सकते हैं जो कहता है:

[] विदेशी कुंजी जांच सक्षम करें

इस चेकबॉक्स को पाने के लिए आपको कम से कम 4.5.0 या उससे अधिक संस्करण चलाना होगा।

यह MySQL CLI- फू नहीं है, लेकिन हे, यह काम करता है!


31
किसने कहा कि हम PHP चला रहे थे ...?
jsh

37
किसने कहा कि हम नहीं? यह उत्तर स्पष्ट रूप से लोगों के लिए उपयोगी साबित होता है; यह मदद करता है।
बेज़मैन

2
यदि आपके पास पैरेंट-चाइल्ड डेटाबेस स्कीमा है, तो यह काम नहीं करेगा।
Cary Bondoc

2
विदेशी कुंजी बाधा विफल।
ब्रायन हैने

2
@BrianHannay यह जून 2015 में पीएमए 4.5.0 में जोड़ा गया मैंने पाया बदलाव का और मूल मुद्दा
निमो

24

MS SQL सर्वर 2005+ (वास्तविक निष्पादन के लिए प्रिंट निकालें ...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

यदि आपका डेटाबेस प्लेटफ़ॉर्म INFORMATION_SCHEMA विचारों का समर्थन करता है, तो निम्न क्वेरी के परिणाम लें और उन्हें निष्पादित करें।

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

MySQL के लिए यह प्रयास करें:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

कॉनसैट में एक अर्धविराम जोड़ने से mysql कार्यक्षेत्र के भीतर से उदाहरण के लिए उपयोग करना आसान हो जाता है।

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES

हाय..धन्यवाद के लिए d उत्तर मैं इस क्वेरी की कोशिश की, लेकिन काम करने के लिए प्रतीत नहीं होता..इस तरह कुछ truncate टेबल table_name है जो मैं अपने db में सभी तालिकाओं के लिए उपयोग कर सकते हैं ..
devang

मैं भूल गया कि MySQL सीधे "+" ऑपरेटर का समर्थन नहीं करता है। यह मानते हुए कि त्रुटि है, मैंने ऊपर CONCAT () उदाहरण जोड़ा। यदि आपको अभी भी एक त्रुटि संदेश मिल रहा है, तो कृपया वास्तविक त्रुटि संदेश साझा करें।
समुद्र तट

इस क्वेरी काम करता है लेकिन क्या मैं एक diff db नाम है, तो जैसे devang..is मेरी db नाम इसलिए यदि मैं अपने ऊपर क्वेरी foll त्रुटि फेंकता के अनुसार इसका इस्तेमाल .. टेबल 'devang.TABLES' मौजूद नहीं है
देवांग

3
आह। INFORMATION_SCHEMA एक दृश्य है जो सक्रिय डेटाबेस में मौजूद है। यदि आप अपना डेटाबेस बदलते हैं, तो उस डीबी के खिलाफ दृश्य निष्पादित किया जाएगा। डेटाबेस बदलते समय क्वेरी को संशोधित करने की कोई आवश्यकता नहीं है। बस इन चरणों का पालन करें: 1) सक्रिय डेटाबेस बदलें। 2) स्क्रिप्ट चलाएँ। 3) परिणामों को कॉपी करें 4) संपादक में परिणाम वापस पेस्ट करें 5) परिणामों को निष्पादित करें। सक्रिय डेटाबेस में सभी तालिकाओं को अब छोटा कर दिया गया है।
समुद्र तट

1
सावधान! यह सभी डेटाबेस में सभी तालिकाओं का चयन करता है (यहां तक ​​कि वे जो वर्तमान डेटाबेस में नहीं हैं। MySQL का उदाहरण काम नहीं करता है, लेकिन मेरे मामले में यह 66 के बजाय 293 पंक्ति (तालिकाओं) में लौट आया। डेटा हानि की कल्पना करें ...)
f4der

19

मुझे यह डेटाबेस में सभी तालिकाओं को छोड़ने के लिए मिला:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

यदि आप समाधान की मेजबानी (एक पूरे डेटाबेस को छोड़ने में सक्षम नहीं) द्वारा उपयोग योग्य हैं।

मैंने इसे तालिकाओं को छोटा करने के लिए संशोधित किया। Mysqldump के लिए कोई "--add-truncate-table" नहीं है, इसलिए मैंने किया:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME

अंतिम कमांड में एक टाइपो फिक्सिंग - मेरे लिए काम करता है


15
SET FOREIGN_KEY_CHECKS = 0;

SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM   information_schema.tables
WHERE  table_type   = 'BASE TABLE'
  AND  table_schema IN ('db1_name','db2_name');

PREPARE stmt FROM @str;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;

यदि आप वर्तमान डेटाबेस के साथ काम करना चाहते हैं (और इस प्रकार इस कोड को पोर्टेबल बनाते हैं), तो अंतिम स्थिति SELECTको इस में बदलें :AND table_schema = DATABASE();
alx

यह मेरे लिए कम नहीं है। MySQL 5.7.25
लुकास Bustamante

14

मुझे यह सबसे सरल लगा कि बस नीचे दिए गए कोड की तरह कुछ करें, बस टेबल के नामों को अपने साथ बदलें। महत्वपूर्ण यह सुनिश्चित करें कि अंतिम पंक्ति हमेशा SET FOREIGN_KEY_CHECKS = 1 है;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;

7
आपको SET FOREIGN_KEY_CHECKS = 0 दोहराना नहीं है; हर TRUNCATE कमांड के बाद बस स्टार्ट लाइन जो 0
HMagdy

12

यह सभी टेबल को अलग करने के लिए कमांड प्रिंट करेगा:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');

5
  1. किसी तालिका को छांटने के लिए, किसी को इस तालिका में अन्य तालिकाओं (वास्तव में विशिष्ट डीबी / स्कीमा में सभी तालिकाओं पर) से स्तंभित विदेशी कुंजी बाधाओं को छोड़ना चाहिए।
  2. इसलिए, सभी विदेशी प्रमुख बाधाओं को शुरुआत में टेबल ट्रंकेशन के बाद छोड़ दिया जाना चाहिए।
  3. वैकल्पिक रूप से, डेटा ट्रंकेशन के बाद OS में उपयोग किए गए डेटा स्थान / आकार को पुनः प्राप्त करने के लिए ऑप्टिमाइज़ टेबल (mysql, innodb इंजन एस्प में) का उपयोग करें।
  4. एक बार डेटा ट्रंकेशन किए जाने के बाद, उसी टेबल पर फिर से वही विदेशी कुंजी अवरोध बनाएँ। एक स्क्रिप्ट के नीचे देखें जो उपरोक्त ऑपरेशन को करने के लिए स्क्रिप्ट उत्पन्न करेगा।

    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';

अब, उत्पन्न Db Truncate.sql स्क्रिप्ट चलाएँ

लाभ। 1) डिस्क स्थान को पुनः प्राप्त करें 2) एक ही संरचना के साथ DB / स्कीमा को छोड़ने और पुनः बनाने की आवश्यकता नहीं है

कमियां। 1) FK बाधाओं को तालिका में नाम होना चाहिए जिसमें बाधा नाम में 'FK' नाम है।


3

यदि sql सर्वर 2005 का उपयोग कर रहा है, तो एक छिपी हुई संग्रहीत प्रक्रिया है जो आपको डेटाबेस के अंदर सभी तालिकाओं के खिलाफ एक कमांड या कमांड सेट करने की अनुमति देती है। यहाँ आप TRUNCATE TABLEइस संग्रहीत प्रक्रिया के साथ कैसे कॉल करेंगे :

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

यहाँ एक अच्छा लेख है जो आगे विस्तार से बताता है।

हालांकि MySql के लिए, आप mysqldump का उपयोग कर सकते हैं और डेटा को अनदेखा करने वाले सभी तालिकाओं को छोड़ने और बनाने के लिए विकल्प --add-drop-tablesऔर --no-dataविकल्प निर्दिष्ट कर सकते हैं । इस तरह:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

dev.mysql से mysqldump उपयोग गाइड


3

इसका उपयोग करें और क्वेरी बनाएं

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';

अब इस क्वेरी का उपयोग करने के लिए इसका उपयोग करें

mysql -u username -p </path/to/file.sql

अगर आपको इस तरह की कोई त्रुटि मिलती है

ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint

आपकी फ़ाइल के शीर्ष पर जाने का सबसे आसान तरीका है इस पंक्ति को जोड़ना

SET FOREIGN_KEY_CHECKS=0;

जो कहता है कि हम इस फाइल से गुजरते समय विदेशी कुंजी बाधाओं की जाँच नहीं करना चाहते हैं।

यह डेटाबेस db1 और bd2 में सभी तालिकाओं को काट देगा।


db नाम qoutes में होना चाहिए
रोमन M

2

नहीं, एक बार में सभी mysql तालिकाओं को काट देने के लिए कोई एकल आदेश नहीं है। आपको एक-एक करके तालिकाओं को छोटा करने के लिए एक छोटी स्क्रिप्ट बनानी होगी।

रेफरी: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html


2

यहाँ मेरा एक संस्करण है 'एक कथन को' सभी को काट देना ''।

सबसे पहले, मैं अपने हेल्पर संग्रहीत प्रक्रियाओं के लिए 'उपयोग' नामक एक अलग डेटाबेस का उपयोग कर रहा हूं। सभी तालिकाओं को छोटा करने के लिए मेरी संग्रहीत प्रक्रिया का कोड है:

DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE  PROCEDURE trunctables(theDb varchar(64))
BEGIN
    declare tname varchar(64);
    declare tcursor CURSOR FOR 
    SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
    SET FOREIGN_KEY_CHECKS = 0; 
    OPEN tcursor;
    l1: LOOP
        FETCH tcursor INTO tname;
        if tname = NULL then leave l1; end if;
        set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
        PREPARE stmt from @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP l1;
    CLOSE tcursor;
    SET FOREIGN_KEY_CHECKS = 1; 
END ;;
DELIMITER ;

एक बार जब आपके पास आपके उपयोग डेटाबेस में यह संग्रहीत कार्यविधि होती है, तो आप इसे कॉल कर सकते हैं

call util.trunctables('nameofdatabase');

जो अब ठीक एक बयान है :-)


2

यहाँ के लिए मैं यहाँ जानता हूँ

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

यदि पेरेंट रो को डिलीट या अपडेट नहीं कर सकते हैं: एक विदेशी कुंजी बाधा विफल रहती है

ऐसा तब होता है जब आपके द्वारा छोड़ी / छांटने की कोशिश कर रहे टेबल के लिए विदेशी कुंजियों के संदर्भ वाली टेबल होती हैं।

तालिकाओं को रौंदने से पहले आपको बस इतना करना है:

SET FOREIGN_KEY_CHECKS=0;

अपनी तालिकाओं को काटें और इसे वापस बदलें

SET FOREIGN_KEY_CHECKS=1; 

उपयोगकर्ता इस php कोड

    $truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");

    while($truncateRow=mysql_fetch_assoc($truncate)){

        mysql_query($truncateRow['tables_query']);

    }
?>

विस्तार से यहां लिंक देखें


1

यहां एक प्रक्रिया है जिसे स्थानीय डेटाबेस में सभी तालिकाओं को छोटा करना चाहिए।

मुझे बताएं कि क्या यह काम नहीं करता है और मैं इस उत्तर को हटा दूंगा।

untested

CREATE PROCEDURE truncate_all_tables()
BEGIN

   -- Declare local variables
   DECLARE done BOOLEAN DEFAULT 0;
   DECLARE cmd VARCHAR(2000);

   -- Declare the cursor
   DECLARE cmds CURSOR
   FOR
   SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;

   -- Declare continue handler
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

   -- Open the cursor
   OPEN cmds;

   -- Loop through all rows
   REPEAT

      -- Get order number
      FETCH cmds INTO cmd;

      -- Execute the command
      PREPARE stmt FROM cmd;
      EXECUTE stmt;
      DROP PREPARE stmt;

   -- End of loop
   UNTIL done END REPEAT;

   -- Close the cursor
   CLOSE cmds;

END;

मुझे यह जानने में बहुत समय लगा कि यह काम क्यों नहीं कर रहा था .. तब इस ई-मेल थ्रेड पर एक टिप्पणी से मदद मिली: मंचों.mysql.com/read.php?61,116597,219343#msg-219343 - संदर्भ के लिए : "दुर्भाग्य से, ऐसा लगता है कि तैयार बयानों को शाप में इस्तेमाल नहीं किया जा सकता है। मैनुअल से: dev.mysql.com/doc/refman/6.0/en/… "
Tominator

1

मुझे लगता है कि TRUNCATE TABLE .. को NOCHECK CONSTRAINT ALL के बाद भी विदेशी प्रमुख बाधाओं से परेशानी है, इसलिए मैं इसके बजाय DELETE FROM स्टेटमेंट का उपयोग करता हूं। इसका मतलब यह है कि पहचान के बीज को रीसेट नहीं किया जाता है, इसे प्राप्त करने के लिए आप हमेशा एक DBCC CHECKIDENT जोड़ सकते हैं।

मैं इसे चलाने से पहले डेटाबेस में सभी तालिकाओं को रौंदने के लिए संदेश विंडो को प्रिंट करने के लिए नीचे दिए गए कोड का उपयोग करता हूं। यह सिर्फ एक गलती करने के लिए थोड़ा कठिन बनाता है।

EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''

0

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि एक कमांड है, जिसका उपयोग करके आप डेटाबेस के स्कीमा को नए डेटाबेस में कॉपी कर सकते हैं, एक बार ऐसा करने के बाद आप पुराने डेटाबेस को हटा सकते हैं और इसके बाद आप फिर से डेटाबेस स्कीमा को पुराने नाम पर कॉपी कर सकते हैं।


1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql यह स्कीमा केवल (कोई डेटा नहीं) के साथ एक sql फ़ाइल बनाएगा। आप इस आदेश के बाद डेटा बेस को हटा सकते हैं और स्कीमा आयात करके डेटाबेस को फिर से बना सकते हैं।
जीजे

0

मुझे पता है कि यह वास्तव में एक आदेश नहीं है, लेकिन इन चरणों का पालन करके वांछित परिणाम phpMyAdmin के भीतर से प्राप्त किया जा सकता है:

  1. सभी (हटाए जाने वाले) टेबल का चयन करें (सभी की जांच करें)
  2. "चयनित:" सूची से "ड्रॉप" / "ट्रंकट" चुनें
  3. पुष्टिकरण पृष्ठ पर ("क्या आप वास्तव में चाहते हैं:") क्वेरी की प्रतिलिपि बनाएँ (लाल पृष्ठभूमि के साथ सब कुछ)
  4. शीर्ष पर जाएं और SQL पर क्लिक करें और लिखें: "SET FOREIGN_KEY_CHECKS = 0;" फिर पहले से कॉपी की गई क्वेरी को पेस्ट करें
  5. "जाओ" पर क्लिक करें

विचार यह है कि डेटाबेस से सभी तालिकाएं जल्दी से प्राप्त करें (जो आप 5 सेकंड और 2 क्लिक में करते हैं) लेकिन पहले विदेशी कुंजी जांच को अक्षम करें। कोई CLI और कोई डेटाबेस को छोड़ने और इसे फिर से जोड़ने के लिए नहीं।


0
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
    do echo "Truncating table ${i}";
    mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
    sleep 1;
done

-

डेविड,

कोड को प्रारूपित करने के लिए समय निकालने के लिए धन्यवाद, लेकिन यह है कि इसे कैसे लागू किया जाना चाहिए।

-Kurt

UNIX या Linux बॉक्स पर:

सुनिश्चित करें कि आप बैश शेल में हैं। इन कमांड्स को कमांड लाइन से निम्नानुसार चलाया जाना है।

ध्यान दें:

मैं अपनी ~ / .my.cnf फ़ाइल में अपनी साख संग्रहीत करता हूं, इसलिए मुझे उन्हें कमांड लाइन पर आपूर्ति करने की आवश्यकता नहीं है।

ध्यान दें:

cpm डेटाबेस नाम है

मैं केवल प्रत्येक आदेश से परिणामों का एक छोटा सा नमूना दिखा रहा हूं।

अपनी विदेशी महत्वपूर्ण बाधाओं का पता लगाएं:

klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
             from information_schema.referential_constraints
             where constraint_schema = 'cpm'
             order by referenced_table_name"
  1. approval_external_system अनुमोदन_request पर निर्भर करता है
  2. पता ग्राहक पर निर्भर करता है
  3. customer_identification ग्राहक पर निर्भर करता है
  4. external_id ग्राहक पर निर्भर करता है
  5. ग्राहक पर विश्वास निर्भर करता है
  6. email_address ग्राहक पर निर्भर करता है
  7. approval_request ग्राहक पर निर्भर करता है
  8. customer_status ग्राहक पर निर्भर करता है
  9. customer_image ग्राहक पर निर्भर करता है

तालिका और पंक्ति की सूची सूचीबद्ध करें:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 297
 2  approval_external_system    0
 3  approval_request    0
 4  country 189
 5  credential  468
 6  customer    6776
 7  customer_identification 5631
 8  customer_image  2
 9  customer_status 13639

अपनी तालिकाओं को काटें:

klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
  1. ट्रंचिंग टेबल का पता
  2. ट्रंचिंग तालिका अनुमोदन_बाह्य_ प्रणाली
  3. ट्रंचिंग टेबल अनुमोदन_क्रेस्ट
  4. ट्रंचिंग टेबल देश
  5. ट्रंकिंग टेबल क्रेडेंशियल
  6. ट्रंचिंग टेबल ग्राहक
  7. ट्रंचिंग टेबल customer_identification
  8. ट्रंचिंग टेबल customer_image
  9. ट्रंचिंग टेबल customer_status

सत्यापित करें कि यह काम किया:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 0
 2  approval_external_system    0
 3  approval_request    0
 4  country 0
 5  credential  0
 6  customer    0
 7  customer_identification 0
 8  customer_image  0
 9  customer_status 0
10  email_address   0

एक विंडोज बॉक्स पर:

ध्यान दें:

cpm डेटाबेस नाम है

C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm

0

निम्न MySQL क्वेरी स्वयं एक एकल क्वेरी उत्पन्न करेगी जो किसी दिए गए डेटाबेस में सभी तालिकाओं को छोटा कर देगी। यह विदेशी कुंजियों को दरकिनार करता है:

SELECT CONCAT(
         'SET FOREIGN_KEY_CHECKS=0; ',
         GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
         'SET FOREIGN_KEY_CHECKS=1;'
       ) as dropAllTablesSql
FROM   ( SELECT  Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
         FROM    INFORMATION_SCHEMA.TABLES
         WHERE   table_schema = 'DATABASE_NAME' ) as queries


0

सोलन 1)

mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;

सोलन 2)

- Export only structure of a db
- drop the database
- import the .sql of structure 

- संपादित करें ----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result

1
यह केवल पहली तालिका को वापस करने के लिए लगता है: TRUNCATE तालिका 1, और अन्य सभी तालिकाओं के बारे में भूल जाता है।
स्टीफन स्मिथ

यह समाधान निश्चित रूप से पागल होगा। मुझे नहीं पता कि यह वोट क्यों नहीं मिला। मेरी गलती के कारण हो सकता है जिसे संपादित किया गया है।
एंजेलिन नादर

0

इसने मेरे लिए काम किया। तदनुसार डेटाबेस, उपयोगकर्ता नाम और पासवर्ड बदलें।

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD


-1

एक विचार सिर्फ टेबल को गिराने और फिर से बनाने का हो सकता है?

संपादित करें:

@ जोनाथन लेफ़लर: सच

अन्य सुझाव (या मामले में आपको सभी तालिकाओं को छोटा करने की आवश्यकता नहीं है):

क्यों न केवल विशिष्ट तालिकाओं को छोटा करने के लिए एक मूल संग्रहीत प्रक्रिया बनाई जाए

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO

यह तालिकाओं पर सभी बाधाओं, अनुमतियों, विचारों आदि को खो देता है - जो कि काफी उपद्रव है।
जोनाथन लेफ़लर

आप एक डिलीट कर सकते हैं, फिर ट्रंकट के बजाय सभी तालिकाओं को फिर से चालू करें। मुझे लगता है कि नीचे का निशान निराशा से बाहर है। बस अपने बैकअप को पुनर्स्थापित करें।
मार्क रेडमैन

-5
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");

// check connection
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}

// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);


// Print message
if ($sql === TRUE) {
  echo 'data delete successfully';
}
else {
 echo 'Error: '. $conn->error;
}

$conn->close();

?>

यहाँ कोड स्निपेट है जिसका उपयोग मैं एक तालिका को साफ़ करने के लिए करता हूँ। बस $ कॉन जानकारी और TABLE_NAME बदलें।


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