我正在编写一些数据库实用程序脚本,我需要做的其中一项任务是重建数据,但保留模式不变。从命令行使用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