如何清空mysql中所有表的所有行(在sql中)

时间:2009-01-17 22:16:46

标签: mysql

我正在编写一些数据库实用程序脚本,我需要做的其中一项任务就是重建数据,但保留模式完整。使用bash和mysql工具(没有php等)从命令行自动执行此操作的最简单方法是什么?

更新: 我想在一个命令中处理所有表的解决方案,如果可能的话,如果添加或删除表,则不需要更新。

4 个答案:

答案 0 :(得分:52)

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]);
}
?>

至少需要一些错误处理。

答案 1 :(得分:4)

如果您使用的是unix / linux,则可以使用shell运行:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

或者Rational Relational有关于如何编写存储过程来执行此操作的blog帖子。

答案 2 :(得分:1)

这是一个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

请注意,截断将删除目标表中的所有数据,而不会提示任何提示。也许首先将“truncate $ i”更改为“描述$ i”以确保结果集中的表是要清空的表。

还有一件事:如果你想迭代所有MySQL数据库中的每个表(information_schemamysql除外,我希望!),将以下内容替换为上面的“database_name1 database_name2”:

`echo 'show databases' | mysql | awk '$1 != "information_schema" && \
$1 != "mysql" {if (NR > 1) {print}}'`

所以,这是一个破坏性较小的样本;它为每个MySQL数据库中的所有表执行OPTIMIZE(例外情况如上所述):

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

修改根据需要执行的“操作”并且非常惶恐!

答案 3 :(得分:0)

对于想通过phpMyAdmin执行此操作的人,请看一下这个问题:

How Can I Delete The Contents Of All Tables In My Database In phpMyAdmin Without Dropping The Database?