我正在編寫一些數據庫實用程序腳本,我需要做的其中一項任務是重建數據,但保留模式不變。從命令行使用bash和mysql工具(不需要php等)自動執行此操作的最簡單方法是什麼?如何從mysql中的所有表中清空所有行(在sql中)
更新: 我想解決方案來處理一個命令中的所有表,如果可能的話,如果添加或刪除表,不需要更新。
我正在編寫一些數據庫實用程序腳本,我需要做的其中一項任務是重建數據,但保留模式不變。從命令行使用bash和mysql工具(不需要php等)自動執行此操作的最簡單方法是什麼?如何從mysql中的所有表中清空所有行(在sql中)
更新: 我想解決方案來處理一個命令中的所有表,如果可能的話,如果添加或刪除表,不需要更新。
TRUNCATE tableName;
這將清空表格的內容。
編輯回覆Q編輯: 從我的快速測試看來,您將不得不做至少2個查詢,因爲看起來「show tables」不能用作子查詢,我不知道如何在bash中做到這一點,所以這裏是一個PHP示例,希望它會有所幫助。
<?php
mysql_connect('localhost', 'user', 'password');
$dbName = "database";
mysql_select_db($dbName); /*added semi-colon*/
$result_t = mysql_query("SHOW TABLES");
while($row = mysql_fetch_assoc($result_t))
{
mysql_query("TRUNCATE " . $row['Tables_in_' . $dbName]);
}
?>
至少需要一些錯誤處理。
如果你是在Unix/Linux可以使用shell來運行:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
或理性關係有一個blog後如何編寫存儲過程來做到這一點。
這裏有一個BASH一個班輪截斷從數據庫列表中的所有表:
for j in database_name1 database_name2; \
do for i in `echo 'show tables ' |mysql $j \
|grep -v 'Tables_in'`; do mysql $j -e "truncate $i"; done; done
請注意,截斷將刪除目標表中的所有數據沒有任何提示。可能首先將「截斷$ i」改爲「描述$ i」,以確保結果集中的表是要清空的表。
一兩件事:如果你想在所有的MySQL數據庫的每個表遍歷(除information_schema
和mysql
,我希望!),代替上述下面的「database_name1 database_name2」:
`echo 'show databases' | mysql | awk '$1 != "information_schema" && \
$1 != "mysql" {if (NR > 1) {print}}'`
所以,這是一個破壞性較小的示例。它執行優化每一個MySQL數據庫中的所有表(例外如上所述):
for j in `echo 'show databases' | mysql | \
awk '$1 != "information_schema" && $1 != \
"mysql" {if (NR > 1) {print}}'`; do for i in \
`echo 'show tables ' |mysql $j |grep -v \
'Tables_in'`; do mysql -e "optimize table $j.$i"; \
done; done
修改「行動」爲需要處理,並與懷着忐忑不安的心情!
對於誰想要通過phpMyAdmin來做到這一點的人,看看這個問題:
有沒有一種方法可以讓我在架構中選擇所有表的名稱養活這個?否則,當添加新表時,我將不得不更新腳本。 – 2009-01-17 22:24:13
我爲你嘗試了TRUNCATE *,但沒有奏效。看起來你必須運行一個SHOW TABLES查詢並採取行動。 – Ross 2009-01-17 22:31:27
我發現這個鏈接http://sqlblogcasts.com/blogs/madhivanan/archive/2007/08/27/truncate-all-tables-part-i.aspx它有一個存儲過程,可以很容易地適應你的需要,或者可以開箱即用。 – UnkwnTech 2009-01-17 22:43:41