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


当前回答

我发现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'''

其他回答

如果使用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使用指南

我知道这不是一个确切的命令,但预期的结果可以从phpMyAdmin通过以下步骤实现:

选择(所有)要删除的表(勾选全部) 从“With selected:”列表中选择“Drop”/“Truncate” 在确认页面(“Do you really want to:”)复制查询(所有带有红色背景的内容) 在顶部,点击SQL并写:“SET FOREIGN_KEY_CHECKS=0;”然后粘贴之前复制的查询 点击“去”

其思想是快速从数据库中获取所有表(只需5秒和2次单击),但首先禁用外键检查。不需要CLI,也不需要删除数据库并重新添加。

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

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

MS SQL Server 2005+(删除打印以实际执行…)

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

由battousaix的Ans是完美的! 我只是使用了他的答案,并创建了截断数据库表的最终工作命令。

mysql -P 3306 -h YOUR_HOST_HERE -u YOUR_USERNAME_HERE -pYOUR_PASSWORD_HERE -Nse 'show tables' DATABASE_NAME |,同时读取表;-h YOUR_HOST_HERE -u your_username - here -pYOUR_PASSWORD_HERE -e "SET FOREIGN_KEY_CHECKS = 0;截断表$ DATABASE_NAME完成

上面的命令将完美地工作于MySQL服务器。

而且,它也包括在内。

设置foreign_key_checks = 0