是否存在在一次操作中截断数据库中所有表的查询(命令)?我想知道我是否可以用一个查询做到这一点。


当前回答

这将输出截断所有表的命令:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');

其他回答

我们可以编写如下所示的bash脚本

truncate_tables_in_mysql() {
    type mysql >/dev/null 2>&1 && echo "MySQL present." || sudo apt-get install -y mysql-client
    
    tables=$(mysql -h 127.0.0.1 -P $MYSQL_PORT -u $MYSQL_USER  -p$MYSQL_PASSWORD -e "USE $BACKEND_DATABASE;    
SHOW TABLES;")
    tables_list=($tables)
    
    query_string="USE $BACKEND_DATABASE; SET FOREIGN_KEY_CHECKS = 0;"
    for table in "${tables_list[@]:1}"
    do
        query_string="$query_string TRUNCATE TABLE \`$table\`; "
    done
    query_string="$query_string SET FOREIGN_KEY_CHECKS = 1;"
    
    mysql -h 127.0.0.1 -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e "$query_string"
}

你可以用你的MySQL细节替换env变量。使用一个命令就可以截断一个DB中的所有表。

我觉得最上面的答案太棒了。但是,当你有一个经过身份验证的MySQL数据库用户时,它就失败了。

这是建立在我链接的顶部答案之上的解决方案。此解决方案安全地处理身份验证,而无需:

为每个表输入密码 担心你的密码泄露到某个地方 对其他MySQL cnf文件(~/.my.cnf)的副作用要了解更多关于这些文件的详细信息,请查看答案底部的参考资料部分。

1. 创建本地。my.cnf文件

vi .temp.my.cnf
[client]
user=<admin_user_goes_here>
password=<admin_password_goes_here>

2. 截断或删除所有表

2.截断所有表(仅为空)

mysql --defaults-extra-file=.temp.my.cnf -Nse 'show tables' <db_name_goes_here> | while read table; do mysql --defaults-extra-file=.temp.my.cnf -e "truncate table $table" <db_name_goes_here>; done

2.B删除所有表(完全删除)

mysql --defaults-extra-file=.temp.my.cnf -Nse 'show tables' <db_name_goes_here> | while read table; do mysql --defaults-extra-file=.temp.my.cnf -e "drop table $table" <db_name_goes_here>; done

3.清理

删除用户密码文件

rm -rf .temp.my.cnf

资源:

https://rtcamp.com/tutorials/mysql/mycnf-preference/ https://dev.mysql.com/doc/refman/8.0/en/option-files.html https://dev.mysql.com/doc/refman/8.0/en/option-file-options.html#option_general_defaults-extra-file

这对我很管用。修改数据库、用户名和密码。

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD

PHP单命令:

php -r '$d="PUT_YOUR_DB_NAME_HERE"; $q="show tables"; $dt="drop table"; exec("mysql -Nse \"$q\" $d", $o); foreach($o as $e) `mysql -e "$dt $e" $d`;'

执行的PHP脚本:

$d="PUT_YOUR_DB_NAME_HERE"; 
$q="show tables"; 
$dt="drop table"; 

exec("mysql -Nse \"$q\" $d", $o); 

foreach($o as $e)
  `mysql -e "$dt $e" $d`;

给@Mathias Bynens的回答补充一点。当我运行这个时,我得到了一个错误,因为外键检查

mysql -Nse 'SHOW TABLES' <database_name> | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; DROP TABLE $table" <database_name>; done

如果数据库中有视图,则返回一个错误。我必须通过drop view <view_name>手动清除视图;