是否有一个查询(命令)可以在一次操作中截断数据库中的所有表?我想知道我是否可以用一个查询来做到这一点。
删除(即删除表)
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done
截断(即空表)
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
以下查询将为 Mysql 模式中的所有数据库表生成一个单独的截断命令列表。 (将 dbSchemaName1
替换为您的 Db 架构的名称。)
SELECT CONCAT('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN ('dbSchemaName1','dbSchemaName2');
复制查询结果(可能如下所示)并将截断命令列表粘贴到 MySQL Worbench 中的 SQL 查询选项卡或您选择的查询命令工具中:
TRUNCATE TABLE dbSchemaName1.table1;
TRUNCATE TABLE dbSchemaName1.table2;
TRUNCATE TABLE dbSchemaName1.table3;
注意:您可能会收到以下错误:
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
如果存在对您尝试删除/截断的表的外键引用的表,则会发生这种情况。
要解决此问题,请在运行 truncate 命令之前关闭外键检查:
SET FOREIGN_KEY_CHECKS=0; -- turn off foreign key checks
TRUNCATE TABLE dbSchemaName1.table1; -- truncate tables
TRUNCATE TABLE dbSchemaName1.table2;
TRUNCATE TABLE dbSchemaName1.table3;
SET FOREIGN_KEY_CHECKS=1; -- turn on foreign key checks
以这种方式使用 phpMyAdmin:
数据库视图 => 检查所有(表) => 空
如果您想忽略外键检查,您可以取消选中以下框:
[]启用外键检查
您至少需要运行 4.5.0 或更高版本才能获得此复选框。
它不是 MySQL CLI-fu,但是,它可以工作!
MS SQL Server 2005+(删除 PRINT 以便实际执行...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
如果您的数据库平台支持 INFORMATION_SCHEMA 视图,请获取以下查询的结果并执行它们。
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
在 MySQL 上试试这个:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
向 Concat 添加分号使其更易于使用,例如在 mysql 工作台中。
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
我发现这会删除数据库中的所有表:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME
如果您受到托管解决方案的限制(无法删除整个数据库),这很有用。
我对其进行了修改以截断表格。 mysqldump没有“--add-truncate-table”,所以我做了:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME
对我有用--edit,修复最后一个命令中的错字
SET FOREIGN_KEY_CHECKS = 0;
SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema IN ('db1_name','db2_name');
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
SELECT
中的最后一个条件更改为:AND table_schema = DATABASE();
SELECT
查询中的最后一个表。 @str
似乎没有将所有表连接在一起。
SELECT @str := GROUP_CONCAT(CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, '') SEPARATOR ';\n')
连接所有行
我发现像下面的代码那样做最简单,只需用你自己的替换表名。重要的是确保最后一行始终是 SET FOREIGN_KEY_CHECKS=1;
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
这将打印截断所有表的命令:
SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
要截断一个表,必须从其他表中删除映射到该表中列的外键约束(实际上是在特定 DB/Schema 中的所有表上)。因此,必须首先删除所有外键约束,然后进行表截断。或者,使用优化表(在 mysql,innodb 引擎 esp 中)在数据截断后将已使用的数据空间/大小回收给 OS。执行数据截断后,在同一个表上再次创建相同的外键约束。请参阅下面的脚本,该脚本将生成执行上述操作的脚本。 SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME