একটি ক্রিয়াকলাপে একটি ডাটাবেসে সমস্ত টেবিল কেটে দেওয়ার জন্য কি কোনও জিজ্ঞাসা (কমান্ড) রয়েছে? আমি জানতে চাই যে আমি একটি একক ক্যোয়ারী দিয়ে এটি করতে পারি কিনা।
একটি ক্রিয়াকলাপে একটি ডাটাবেসে সমস্ত টেবিল কেটে দেওয়ার জন্য কি কোনও জিজ্ঞাসা (কমান্ড) রয়েছে? আমি জানতে চাই যে আমি একটি একক ক্যোয়ারী দিয়ে এটি করতে পারি কিনা।
উত্তর:
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
মাইএসকিএল উদাহরণে একাধিক ডাটাবেস টেবিলগুলি কেটে দিন
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
যদি আপনি যে টেবিলটি ড্রপ / কাটানোর চেষ্টা করছেন তার সাথে বিদেশী কীগুলির রেফারেন্স সহ টেবিলগুলি থাকে That
টেবিলগুলি কাটানোর আগে আপনাকে যা করতে হবে তা হ'ল:
SET FOREIGN_KEY_CHECKS=0;
আপনার টেবিলগুলি ছাঁটাই করুন এবং এটিকে আবার পরিবর্তন করুন
SET FOREIGN_KEY_CHECKS=1;
এইভাবে phpMyAdmin ব্যবহার করুন:
ডাটাবেস ভিউ => সমস্ত পরীক্ষা করুন (সারণী) => খালি করুন
আপনি যদি বিদেশী কী পরীক্ষাগুলি উপেক্ষা করতে চান, আপনি যে বাক্সটি বলেছেন তা আনছেক করতে পারেন:
[] বিদেশী কী পরীক্ষাগুলি সক্ষম করুন
এই চেকবক্সটি পেতে আপনার ন্যূনতম সংস্করণ 4.5.0 বা তারও বেশি চলতে হবে।
এটি মাইএসকিউএল সিএলআই-ফু নয়, তবে ওহে, এটি কাজ করে!
এমএস এসকিউএল সার্ভার 2005+ (প্রকৃত বাস্তবায়নের জন্য PRINT সরান ...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
যদি আপনার ডাটাবেস প্ল্যাটফর্ম INFORMATION_SCHEMA দর্শনগুলিকে সমর্থন করে তবে নীচের ক্যোয়ারির ফলাফল নিন এবং এগুলি সম্পাদন করুন।
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
মাইএসকিউএল এর জন্য এটি ব্যবহার করে দেখুন:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
কনক্যাটটিতে একটি সেমিকোলন যুক্ত করা যেমন মাইএসকিএল ওয়ার্কবেঞ্চের মধ্যে থেকে যেমন ব্যবহার করা সহজ করে তোলে।
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
আপনি হোস্টিং সলিউশন দ্বারা সীমাবদ্ধ থাকলে পুরো ব্যবহারযোগ্য (পুরো ডাটাবেস ড্রপ করতে সক্ষম নয়)।
আমি টেবিলগুলি কাটাতে এটি পরিবর্তন করেছি। মাইসকিলডাম্পের জন্য কোনও "--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
আমার জন্য --edit কাজ করে, শেষ কমান্ডে একটি টাইপ ফিক্স করে
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();
আমি নীচের কোডের মতো কিছু করা খুব সহজ বলে মনে করেছি, কেবল নিজের নিজের সাথে টেবিলের নামগুলি প্রতিস্থাপন করব। গুরুত্বপূর্ণ লাইনটি সর্বদা সর্বদা SEX 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';এখন, উত্পাদিত ডিবি ট্রাঙ্কেট.এসকিউএল স্ক্রিপ্টটি চালান
উপকারিতা। 1) ডিস্ক স্পেস পুনরায় দাবি 2) একই কাঠামো সহ ডিবি / স্কিমা ড্রপ এবং পুনরায় তৈরি করার প্রয়োজন নেই
অপূর্ণতা। 1) এফকে সীমাবদ্ধতার সীমাবদ্ধতার নামটিতে 'এফকে' থাকা নাম সহ টেবিলে নাম থাকা উচিত।
যদি এসকিএল সার্ভার 2005 ব্যবহার করে থাকে তবে একটি লুকানো সঞ্চিত প্রক্রিয়া রয়েছে যা আপনাকে একটি ডাটাবেসের ভিতরে থাকা সমস্ত টেবিলের বিপরীতে একটি কমান্ড বা কমান্ডের একটি সেট কার্যকর করতে দেয়। আপনি কীভাবে TRUNCATE TABLEএই সঞ্চিত প্রক্রিয়াটির সাথে কল করবেন :
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
এখানে আরও একটি বিশদ বিবরণ দেওয়া হয়েছে।
মাইএসকিউএল জন্য, যাইহোক, আপনি 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;
যা বলে যে আমরা এই ফাইলটি দিয়ে যাওয়ার সময় বিদেশী কী বাধাগুলি পরীক্ষা করতে চাই না।
এটি ডিবি 1 এবং বিডি 2 ডাটাবেসে সমস্ত সারণী কেটে যাবে।
না। সমস্ত মাইএসকিএল টেবিল একবারে কাটানোর জন্য কোনও একক আদেশ নেই। একের পর এক টেবিলগুলি কাটাতে আপনাকে একটি ছোট স্ক্রিপ্ট তৈরি করতে হবে।
রেফ: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
'Em all কে ছুঁড়ে ফেলার এক বিবৃতি' পেতে আমার বৈকল্পিক এখানে।
প্রথমত, আমি আমার সহায়ক সঞ্চিত পদ্ধতির জন্য 'ব্যবহার' নামে একটি পৃথক ডাটাবেস ব্যবহার করছি। সমস্ত সারণী ছিন্ন করার জন্য আমার সঞ্চিত পদ্ধতির কোডটি হ'ল:
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');
যদি পিতামাতার সারিটি মুছতে বা আপডেট করতে না পারে: একটি বিদেশী কী সীমাবদ্ধতা ব্যর্থ হয়
যদি আপনি যে টেবিলটি ড্রপ / কাটানোর চেষ্টা করছেন তার সাথে বিদেশী কীগুলির রেফারেন্স সহ টেবিলগুলি থাকে That
টেবিলগুলি কাটানোর আগে আপনাকে যা করতে হবে তা হ'ল:
SET FOREIGN_KEY_CHECKS=0;
আপনার টেবিলগুলি ছাঁটাই করুন এবং এটিকে আবার পরিবর্তন করুন
SET FOREIGN_KEY_CHECKS=1;
ব্যবহারকারী এই পিএইচপি কোড
$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']);
}
?>
বিস্তারিত এখানে লিঙ্ক চেক
এখানে একটি পদ্ধতি যা স্থানীয় ডাটাবেসে সমস্ত সারণী ছিন্ন করা উচিত।
যদি এটি কাজ না করে তবে আমাকে জানান এবং আমি এই উত্তরটি মুছব।
অপরীক্ষিত
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;
আমি দেখতে পেলাম যে ট্র্যাঙ্কেট টেবিলে .. বিদেশী কী বাধাগুলির সাথে সমস্যা আছে, এমনকি কোনও কিছু নিয়ন্ত্রণ ছাড়ার পরেও আমি এর পরিবর্তে একটি বিলোপ বিবরণী ব্যবহার করি। এর অর্থ এই যে পরিচয়ের বীজগুলি পুনরায় সেট করা হয় না, আপনি এটি অর্জন করতে সর্বদা একটি ডিবিসিসি চেকিডেন্ট যুক্ত করতে পারেন।
আমি নীচের কোডটি বার্তা উইন্ডোতে প্রিন্ট আউট করতে ডাটাবেসের সমস্ত টেবিলের ছাঁটাই করার জন্য, বিকাশ করার আগে স্কুএল করতে চাইছি। এটিকে ভুল করা একটু শক্ত করে তোলে।
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'''
আমি নিশ্চিত নই তবে আমি মনে করি একটি কমান্ড রয়েছে যার সাহায্যে আপনি ডাটাবেসের স্কিমাটি নতুন ডাটাবেসে অনুলিপি করতে পারবেন, এটি করা হয়ে গেলে আপনি পুরাতন ডাটাবেসটি মুছতে পারেন এবং এর পরে আপনি আবার ডাটাবেস স্কিমাটিকে পুরানো নামে অনুলিপি করতে পারবেন।
আমি জানি এটি ঠিক একটি আদেশ নয়, তবে এই পদক্ষেপগুলি অনুসরণ করে পিএইচপিএমআইএডমিনের মধ্যে থেকে পছন্দসই ফলাফলটি পাওয়া যেতে পারে:
ডাটাবেস থেকে সমস্ত টেবিলগুলি দ্রুত (যেটি আপনি 5 সেকেন্ড এবং 2 ক্লিকের মধ্যে করেন) তা পেতে প্রথমে ধারণাটি পাওয়া যাচ্ছে তবে প্রথমে বিদেশী কী চেকগুলি অক্ষম করুন। কোনও সিএলআই এবং কোনও ডাটাবেস ফেলে না রেখে এটি আবার যুক্ত করা হবে না।
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
ইউনিক্স বা লিনাক্স বাক্সে:
নিশ্চিত হন যে আপনি বাশ শেলের মধ্যে রয়েছেন। এই কমান্ডগুলি নিম্নলিখিত কমান্ড লাইন থেকে চালানো হবে।
বিঃদ্রঃ:
আমি আমার শংসাপত্রগুলি আমার ~ / .my.cnf ফাইলে সংরক্ষণ করি, সুতরাং কমান্ড লাইনে সেগুলি সরবরাহ করার দরকার নেই।
বিঃদ্রঃ:
সিপিএম হ'ল ডাটাবেসের নাম
আমি প্রতিটি কমান্ড থেকে ফলাফলের একটি ক্ষুদ্র নমুনা দেখিয়ে চলেছি।
আপনার বিদেশী কী বাধাগুলি সন্ধান করুন:
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
একটি উইন্ডোজ বাক্সে:
বিঃদ্রঃ:
সিপিএম হ'ল ডাটাবেসের নাম
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
নিম্নলিখিত মাইএসকিউএল কোয়েরি নিজেই একটি একক কোয়েরি তৈরি করবে যা প্রদত্ত ডাটাবেসে সমস্ত টেবিলকে ছিন্ন করবে। এটি বিদেশী কীগুলি বাইপাস করে:
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 পরিবর্তন করুন।