我正在编写一些数据库实用程序脚本,其中一个任务是仅重建数据,但保留模式。使用bash和mysql工具(无需php等),从命令行自动完成这个最简单的方法是什么?
更新: 我希望解决方案能够一次处理所有表格,并且如果可能的话,不需要在表格添加或删除时进行更新。
更新: 我希望解决方案能够一次处理所有表格,并且如果可能的话,不需要在表格添加或删除时进行更新。
TRUNCATE tableName;
这将清空表格的内容。
根据编辑的回答,从我的快速测试中看来,你至少需要进行两个查询,因为似乎“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]
或者说Rational Relational在其博客文章中介绍了如何编写存储过程来实现此功能。
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
`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
根据需要和谨慎修改执行的“操作”!
for i in $(echo 'SHOW TABLES' | mysql -uroot -p<pwd> <dbname> | grep -v "Tables_in"); do echo "DELETE FROM $i;"; done | mysql -uroot -p<pwd> <dbname>
- John Calcote