常見的刪除數據庫表中數據的方法是通過delete或者truncate的方法進行刪除操作,如果刪除的是表中某一條或者部分數據的話適合用delete操作進行刪除,如果要刪除表中所有的數據的話,適合是同truncate進行刪除操作。
那麼問題來了,如果某一個數據庫中有很多張表,此時我想將該數據庫中所有表中的數據全部刪掉,該如何操作呢?
解決該問題主要分兩種情況,如果不需要保留數據庫中所有表的結構,那麼答案很簡單,執行命令drop database 數據庫名 即可達到目的。但是如果需要保留該數據庫中所有表的結構,只想刪除所有表中的數據,又該怎麼解決呢?有人會說可以多執行幾次truncate操作就OK啦,沒錯,多執行幾次truncate確實可以達到目的,但是,如果要刪除的數據庫中有很多張表,幾十張上百張表,執行上百次truncate操作顯然不是好的辦法?至此,就是本文要說講到的辦法了。刪除的辦法其實還是執行truncat方法,只是不需要每次手動的輸入truncate命令進行刪除。通過sql命令的方式生成所有的truncate語句並寫入到.sql腳本文件中,然後執行腳本即可完成刪除操作,並且保留了表結構。
生成truncate命令的sql語句爲:SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' into outfile '/tmp/truncate_test.sql';
然後將生成的.sql腳本拷貝到當前文件夾下面:mv /tmp/truncate_test.sql $current_dir/
然後執行.sql腳本將數據庫中所有表中數據刪除:source $current_dir/truncate_test.sql
說明:
在進行select....into outfile......操作時,默認只能將文件寫入到tmp路徑下,可以不用將tmp文件夾下面的.sql腳本移動到當前文件夾下,直接在tmp路徑下執行.sql腳本即可。如果要寫入到其他路徑下,需要給mysql的守護進程賦寫操作的權限,最簡單的辦法是將/etc/selinux路勁下的config配置文件中的SELINUX修改成disabled可以實現寫入其他路徑下,這裏不展開說明。
結合上一篇博文mysql數據庫的備份和恢復,下面貼出一個小腳本的源碼和運行截圖。使用該腳本進行數據備份和恢復時,源和目的數據庫中的所有表結構需要一致,否則執行可能出錯。該腳本主要實現mysql數據庫的備份和恢復,以及一次刪除整個數據庫中所有表數據並保留數據表結構。
運行結果截圖說明:
1):備份test數據庫中的所有數據
2):恢復數據
3):刪除數據庫test中所有表中的所有數據,並保留表結構
腳本源碼:
#/bin/bash
while [ 1 ]
do
echo " #############################################"
echo " Quick Backup and Recovery"
echo " Source and Destination Mysql Must Be Same"
echo " #############################################"
echo " 1) Back up database test"
echo " 2) Recovery database test"
echo " 3) Clear data in database test"
echo " q) Quit"
echo -n " Your Option:"
read option_char
current_dir=$(pwd)
case ${option_char} in
"1")
rm -f $current_dir/test_bk.sql
mysqldump -t -c -uroot -proot test > $current_dir/test_backup.sql
echo " Database test already backup..."
;;
"2")
mysql -u root --password='root' -e "
use test
source $current_dir/test_backup.sql"
echo " Database test already recovery..."
;;
"3")
rm -f $current_dir/truncate_test.sql
chmod 777 $current_dir
mysql -u root --password='root' -e "
SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' into outfile '/tmp/truncate_test.sql';"
mv /tmp/truncate_test.sql $current_dir/
mysql -u root --password='root' -e "
use test
source $current_dir/truncate_test.sql"
echo " Clear data of test successful..."
;;
"q"|"quit"|"exit"|'Q'|"QUIT"|"Quit")
break
;;
*)
echo "your option is invalid, please input again..."
;;
esac
done