是否有一条查询(命令)可以在一次操作中截断数据库中的所有表?我想知道是否可以用一条单独的查询来完成这个任务。
是否有一条查询(命令)可以在一次操作中截断数据库中的所有表?我想知道是否可以用一条单独的查询来完成这个任务。
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`;'
$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`;
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
do echo "Truncating table ${i}";
mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
sleep 1;
done
--
大卫,
感谢您抽出时间进行代码格式化,但是这就是应该如何应用它。
-Kurt
在 UNIX 或 Linux 系统上:
确保您处于 bash shell 中。下面的命令将作为命令行运行。
注意:
我将我的凭据存储在 ~/.my.cnf 文件中,因此不需要在命令行中提供它们。
注意:
cpm 是数据库名称。
我只展示了每个命令的少量结果。
查找外键约束:
klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
from information_schema.referential_constraints
where constraint_schema = 'cpm'
order by referenced_table_name"
列出表格和行数:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 297
2 approval_external_system 0
3 approval_request 0
4 country 189
5 credential 468
6 customer 6776
7 customer_identification 5631
8 customer_image 2
9 customer_status 13639
清空你的数据表:
klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
确认操作成功:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 0
2 approval_external_system 0
3 approval_request 0
4 country 0
5 credential 0
6 customer 0
7 customer_identification 0
8 customer_image 0
9 customer_status 0
10 email_address 0
C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm
解决方案1)
mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;
解决方案2)
- Export only structure of a db
- drop the database
- import the .sql of structure
-- 编辑 ----
earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
SELECT CONCAT(
'SET FOREIGN_KEY_CHECKS=0; ',
GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
'SET FOREIGN_KEY_CHECKS=1;'
) as dropAllTablesSql
FROM ( SELECT Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'DATABASE_NAME' ) as queries
我不确定,但我认为有一条命令可以将数据库的模式复制到新数据库中,一旦完成此操作,您可以删除旧数据库,然后再次将数据库模式复制到旧名称。
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql
对@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>;
。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详细信息替换环境变量。使用一个命令,您可以清空数据库中的所有表。
(export MYSQL_PWD=the_password; dbNameMatch="the_database_name_prefix%"; databaseList=$(mysql -u root -Nse "SHOW DATABASES LIKE '$dbNameMatch'"); for dbName in $databaseList; do mysql -uroot -Nse 'show tables' "$dbName" | while read table; do mysql -uroot -e "truncate table \`$table\`" "$dbName" & done; done)
一个想法是直接删除并重新创建表格?
编辑:
@Jonathan Leffler:没错
其他建议(或者你不需要截断所有表格的情况):
为什么不创建一个基本的存储过程来截断特定的表格呢?
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO