【问题标题】:Truncate almost all the tables in a SQL Database截断 SQL 数据库中的几乎所有表
【发布时间】:2015-09-19 05:21:13
【问题描述】:

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

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

我已经看到很多关于截断 所有 的帖子(即使使用外键,我也有),但我希望我可以用一些“如果”来做一些棘手的扑克类型结构。最好的解决方案是把那几张表复制出来,做this,然后把数据复制回去吗?

【问题讨论】:

  • 您可以使用截断工具来选择/取消选择多个表,例如 MySQL 的 sqlyog
  • 我可能会使用这样的查询.. 如果它是一次性的。选择'截断'+TABLE_NAME+';'来自 INFORMATION_SCHEMA.TABLES Where TABLE_NAME!=''
  • 您应该指定目标数据库引擎。我怀疑解决方案在很大程度上取决于它。

标签: mysql sql-server sql-server-2008 truncate


【解决方案1】:

正如您提到的,您对 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)

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

【讨论】:

    【解决方案2】:

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

    假设数据库有外键,您要么必须以正确的顺序截断表,要么禁用/删除约束。这比上面更令人头疼,但可能有可用的例程。

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

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2010-09-14
      • 2011-02-19
      • 2011-08-12
      • 1970-01-01
      相关资源
      最近更新 更多