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


当前回答

这里,我知道这里

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

如果不能删除或更新父行:外键约束失败

如果存在外键指向您试图删除/截断的表的表,就会发生这种情况。

在截断表之前,你需要做的是:

SET FOREIGN_KEY_CHECKS=0;

截断您的表并将其更改回

SET FOREIGN_KEY_CHECKS=1; 

使用这段PHP代码 $truncate = mysql_query("SELECT Concat(' truncate TABLE ',table_schema,'. "',TABLE_NAME, ';')作为table_query FROM INFORMATION_SCHEMA。table where table_schema in ('databasename')"); 而($ truncateRow =作用(截断)美元){ mysql_query()美元truncateRow [' tables_query ']); } ? > 查看详情 链接

其他回答

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;

我发现TRUNCATE表..外键约束有问题,即使在NOCHECK约束ALL之后,所以我使用DELETE FROM语句代替。这意味着身份种子不会被重置,你总是可以添加一个DBCC CHECKIDENT来实现这一点。

我使用下面的代码打印到消息窗口的sql截断数据库中的所有表,然后运行它。这只会让犯错变得更难。

EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''

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`;

如果使用SQL server 2005,有一个隐藏的存储过程,允许您对数据库中的所有表执行一个或一组命令。下面是如何用这个存储过程调用TRUNCATE TABLE:

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

这里有一篇很好的文章进一步阐述。

然而,对于MySql,你可以使用mysqldump并指定——add-drop-tables和——no-data选项来删除和创建所有忽略数据的表。是这样的:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

Mysqldump使用指南

下面的查询将为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