क्या एक ऑपरेशन में डेटाबेस में सभी तालिकाओं को अलग करने के लिए एक क्वेरी (कमांड) है? मैं जानना चाहता हूं कि क्या मैं एक सिंगल क्वेरी के साथ ऐसा कर सकता हूं।
क्या एक ऑपरेशन में डेटाबेस में सभी तालिकाओं को अलग करने के लिए एक क्वेरी (कमांड) है? मैं जानना चाहता हूं कि क्या मैं एक सिंगल क्वेरी के साथ ऐसा कर सकता हूं।
जवाबों:
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
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
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;
इस तरह से phpMyAdmin का उपयोग करें:
डेटाबेस देखें => सभी जांचें (तालिकाओं) => खाली
यदि आप विदेशी कुंजी चेक को अनदेखा करना चाहते हैं, तो आप उस बॉक्स को अनचेक कर सकते हैं जो कहता है:
[] विदेशी कुंजी जांच सक्षम करें
इस चेकबॉक्स को पाने के लिए आपको कम से कम 4.5.0 या उससे अधिक संस्करण चलाना होगा।
यह MySQL CLI- फू नहीं है, लेकिन हे, यह काम करता है!
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
मुझे यह डेटाबेस में सभी तालिकाओं को छोड़ने के लिए मिला:
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
अंतिम कमांड में एक टाइपो फिक्सिंग - मेरे लिए काम करता है
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();
मुझे यह सबसे सरल लगा कि बस नीचे दिए गए कोड की तरह कुछ करें, बस टेबल के नामों को अपने साथ बदलें। महत्वपूर्ण यह सुनिश्चित करें कि अंतिम पंक्ति हमेशा 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;
यह सभी टेबल को अलग करने के लिए कमांड प्रिंट करेगा:
SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
एक बार डेटा ट्रंकेशन किए जाने के बाद, उसी टेबल पर फिर से वही विदेशी कुंजी अवरोध बनाएँ। एक स्क्रिप्ट के नीचे देखें जो उपरोक्त ऑपरेशन को करने के लिए स्क्रिप्ट उत्पन्न करेगा।
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' नाम है।
यदि 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]
इसका उपयोग करें और क्वेरी बनाएं
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 में सभी तालिकाओं को काट देगा।
नहीं, एक बार में सभी mysql तालिकाओं को काट देने के लिए कोई एकल आदेश नहीं है। आपको एक-एक करके तालिकाओं को छोटा करने के लिए एक छोटी स्क्रिप्ट बनानी होगी।
रेफरी: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
यहाँ मेरा एक संस्करण है 'एक कथन को' सभी को काट देना ''।
सबसे पहले, मैं अपने हेल्पर संग्रहीत प्रक्रियाओं के लिए 'उपयोग' नामक एक अलग डेटाबेस का उपयोग कर रहा हूं। सभी तालिकाओं को छोटा करने के लिए मेरी संग्रहीत प्रक्रिया का कोड है:
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');
जो अब ठीक एक बयान है :-)
यहाँ के लिए मैं यहाँ जानता हूँ
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']);
}
?>
विस्तार से यहां लिंक देखें
यहां एक प्रक्रिया है जिसे स्थानीय डेटाबेस में सभी तालिकाओं को छोटा करना चाहिए।
मुझे बताएं कि क्या यह काम नहीं करता है और मैं इस उत्तर को हटा दूंगा।
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;
मुझे लगता है कि 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'''
मुझे यकीन नहीं है, लेकिन मुझे लगता है कि एक कमांड है, जिसका उपयोग करके आप डेटाबेस के स्कीमा को नए डेटाबेस में कॉपी कर सकते हैं, एक बार ऐसा करने के बाद आप पुराने डेटाबेस को हटा सकते हैं और इसके बाद आप फिर से डेटाबेस स्कीमा को पुराने नाम पर कॉपी कर सकते हैं।
मुझे पता है कि यह वास्तव में एक आदेश नहीं है, लेकिन इन चरणों का पालन करके वांछित परिणाम phpMyAdmin के भीतर से प्राप्त किया जा सकता है:
विचार यह है कि डेटाबेस से सभी तालिकाएं जल्दी से प्राप्त करें (जो आप 5 सेकंड और 2 क्लिक में करते हैं) लेकिन पहले विदेशी कुंजी जांच को अक्षम करें। कोई CLI और कोई डेटाबेस को छोड़ने और इसे फिर से जोड़ने के लिए नहीं।
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"
तालिका और पंक्ति की सूची सूचीबद्ध करें:
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
सत्यापित करें कि यह काम किया:
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
निम्न 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
सोलन 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
एक विचार सिर्फ टेबल को गिराने और फिर से बनाने का हो सकता है?
संपादित करें:
@ जोनाथन लेफ़लर: सच
अन्य सुझाव (या मामले में आपको सभी तालिकाओं को छोटा करने की आवश्यकता नहीं है):
क्यों न केवल विशिष्ट तालिकाओं को छोटा करने के लिए एक मूल संग्रहीत प्रक्रिया बनाई जाए
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
<?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 बदलें।