वहाँ एक MySQL डेटाबेस से सभी तालिकाओं को छोड़ने का एक अच्छा आसान तरीका है, किसी भी विदेशी प्रमुख बाधाओं की अनदेखी करना जो वहां हो सकता है?
Drop
ड्रॉपडाउन मेनू से चुनते हैं तो आप Foreign key check
चेकबॉक्स को अनचेक कर सकते हैं ।
वहाँ एक MySQL डेटाबेस से सभी तालिकाओं को छोड़ने का एक अच्छा आसान तरीका है, किसी भी विदेशी प्रमुख बाधाओं की अनदेखी करना जो वहां हो सकता है?
Drop
ड्रॉपडाउन मेनू से चुनते हैं तो आप Foreign key check
चेकबॉक्स को अनचेक कर सकते हैं ।
जवाबों:
मैंने ड्रॉप स्टेटमेंट के जनरेट सेट को उपयोगी पाया, और इन ट्विक्स की सिफारिश की:
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`
मैन्युअल रूप से सही करना होगा।
"RESTRICT और CASCADE को पोर्टिंग को आसान बनाने की अनुमति है। MySQL 5.5 में, वे कुछ भी नहीं करते हैं।"
इसलिए, यदि आवश्यक हो तो काम करने के लिए ड्रॉप स्टेटमेंट के लिए:
SET FOREIGN_KEY_CHECKS = 0
यह संदर्भात्मक अखंडता जांचों को अक्षम कर देगा - इसलिए जब आपको अपनी ज़रूरत की बूंदों का प्रदर्शन किया जाता है, तो आप कुंजी चेकिंग को रीसेट करना चाहेंगे
SET FOREIGN_KEY_CHECKS = 1
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
एनबी: SELECT ईजी के आउटपुट का उपयोग करने के लिए, mysql -B विकल्प मदद कर सकता है।
DROP DATABASE foo; CREATE DATABASE foo;
जो किया वह वास्तव में कर रहा है , जो कि बहुत समान नहीं है, लेकिन मेरे लिए काम किया है।
से 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;
(ध्यान दें कि यह जवाब देता है कि मनमाने क्रम में तालिकाओं को ड्रॉप करने में सक्षम होने के लिए विदेशी कुंजी जांचों को कैसे निष्क्रिय किया जाए। यह जवाब नहीं देता है कि सभी मौजूदा तालिकाओं के लिए ड्रॉप-टेबल स्टेटमेंट को स्वचालित रूप से कैसे उत्पन्न किया जाए और उन्हें एक स्क्रिप्ट में निष्पादित किया जाए। जीन का जवाब। कर देता है।)
यहाँ 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`;
_tableName
एक बैकक्वॉट के साथ लपेटना चाहिए । अन्यथा यह कुछ तालिकाओं जैसे group
या अन्य कीवर्ड पर विफल हो जाएगा ।
ऊपर प्रत्येक दृष्टिकोण में इस एक 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
mysqldump
लिए पाइप mysql
?
mysqldump
में grep
में mysql
, यह काम करता है। आपके समाधान के लिए फिर से धन्यवाद, यह अच्छा है।
से इस उत्तर ,
निष्पादित:
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
यहाँ एक कर्सर आधारित समाधान है। किंडा लंबा लेकिन एकल 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`;
तुम कर सकते हो:
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/…
concat
बजाय उपयोग करने के लिए कोड नमूना फिक्स्ड||
मैं इस बदलाव के साथ 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
, यदि आवश्यक हो)।
विषय पर गुगली करना मुझे हमेशा इस 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`;
दिए गए डेटाबेस से सभी तालिकाओं को छोड़ने के लिए एक लाइनर:
echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"
इसे चलाने से डेटाबेस DATABASE_NAME की सभी तालिकाएँ गिर जाएँगी।
और इसके बारे में एक अच्छी बात यह है कि डेटाबेस का नाम केवल एक बार स्पष्ट रूप से लिखा गया है।
यहाँ एक बैश स्क्रिप्ट के माध्यम से ऐसा करने का एक स्वचालित तरीका है:
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
अगर 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;
मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि यह तरीका तेज और सरल है।
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 बदलने के लिए याद है, और जाहिर है उपयोगकर्ता / पास।
एक लिनक्स शेल में जैसे बाश / 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 कमांड को अन्य नाम दे सकते हैं।)
सभी तालिकाओं को गिराने के लिए जोनाथन वाट द्वारा की गई कुछ उपयोगी टिप्पणी को यहाँ रखें
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
यह मेरी मदद करता है और मुझे उम्मीद है कि यह उपयोगी हो सकता है
कमांड लाइन से एक लाइन के साथ डेटाबेस से सभी तालिकाओं को छोड़ें:
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] को एक वास्तविक डेटा (उपयोगकर्ता, पासवर्ड, होस्ट नाम, डेटाबेस नाम) के साथ बदलना होगा।
यह एक बहुत पुरानी पोस्ट है, लेकिन यहाँ किसी भी उत्तर ने वास्तव में मेरी राय में सवाल का जवाब नहीं दिया है, इसलिए मुझे आशा है कि मेरी पोस्ट लोगों की मदद करेगी!
मुझे यह समाधान एक और सवाल पर मिला, जो मेरे लिए बहुत अच्छा काम करता है:
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
कमांड लाइन ।
उम्मीद है की यह मदद करेगा!
@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}
यह समाधान @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
DB="your database name" \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
&& mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=1"
सरल और स्पष्ट (हो सकता है)।
एक फैंसी समाधान नहीं हो सकता है, लेकिन इसने मुझे काम किया और मेरा दिन बचाया।
सर्वर संस्करण के लिए काम किया: 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>
मैं 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 स्टेटमेंट को हटा दें (मुझे अतिरिक्त सुरक्षा पसंद है)।
सबसे अच्छा उपायमेरे लिए अब तक का
डेटाबेस का चयन करें -> राइट क्लिक -> कार्य -> स्क्रिप्ट उत्पन्न करें - स्क्रिप्ट बनाने के लिए विज़ार्ड खोल देगा। सेट स्क्रिप्टिंग ऑप्शन में ऑब्जेक्ट चुनने के बाद एडवांस्ड बटन पर क्लिक करें । के तहत "स्क्रिप्ट ड्रॉप और बनाएँ" का चयन स्क्रिप्ट ड्रॉप ।
स्क्रिप्ट चलाएँ।