截断 SQL 数据库中的几乎所有表

Truncate almost all the tables in a SQL Database

我对 SQL 非常陌生,所以如果有什么地方可以让我自己更好地回答这个问题,请告诉我。

我有一个数据库,其中包含数百个表,这些表的填充程度不同。我需要截断几乎所有的数据以进行测试,同时保留一些数据以进行配置。

我已经看到很多关于截断 所有 的帖子(即使使用外键,我也有),但我希望有一些我可以使用的拼图游戏一些 'if' 类型的结构。最好的解决方案是否只是复制出那几张表,执行 this,然后将数据复制回去?

限制某些 table 并不困难。您可以创建一个临时 table 或 table 变量,其中包含它们的名称。然后您可以在数据库中创建所有 table 名称的列表,这些名称不在您为管理员创建的结构中。

假设数据库有外键,您必须按正确的顺序截断 table 或 disable/drop 约束。这比上面的更令人头疼,但是周围可能有可用的例程。

具体细节需要知道您使用的是什么数据库系统(sql 服务器、我的 sql、oracle 等)

正如您提到的,您是 SQL 的新手,这里有一个非常基本的脚本来生成 TRUNCATE 查询:

DECLARE @ExcludedTables TABLE (TableName NVARCHAR(MAX))
INSERT INTO @ExcludedTables VALUES ('Table1')
INSERT INTO @ExcludedTables VALUES ('Table2')
INSERT INTO @ExcludedTables VALUES ('Table3')

SELECT 'TRUNCATE TABLE [' + S.[name] + '].[' + T.[name] + ']', T.*
FROM sys.tables AS T 
INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id 
WHERE T.[name] NOT IN (SELECT TableName FROM @ExcludedTables)

我创建了一个 table 变量,您可以在其中插入要排除的 table 名称。为此,您也可以使用临时的 table,甚至是普通的 table。