在 SQL Server 2005 中截断数据库的所有表
Posted
技术标签:
【中文标题】在 SQL Server 2005 中截断数据库的所有表【英文标题】:Truncate all tables of a database in SQL Server 2005 【发布时间】:2011-03-30 08:14:53 【问题描述】:如何截断数据库的所有表?
【问题讨论】:
【参考方案1】:为什么要截断所有表?如果你想要一个空数据库,为什么不运行数据库的CREATE
脚本呢?
如果要截断由外键引用的表,则必须先删除 FK 约束。在最新版本的 SQL Server 中,禁用约束已经不可能了。
【讨论】:
我是一名程序员,我在表格中输入了许多信息进行测试。表格有自动增量字段。我想截断表格以再次从 0 开始增量。 给我一个解决方案,将所有表的自动增量从 0 重置(当它为空时) 最好的方法是删除数据库并使用应用程序的创建数据库脚本创建数据库。这样,您还可以测试应用程序的创建数据库脚本。但是您可以使用 EXEC sp_MSforeachtable @command1="EXEC DBCC CHECKIDENT ('?')" 来重置所有表中的所有标识列【参考方案2】:你可以看到这个帖子:how-do-you-truncate-all-tables-in-a-database-using-tsql
【讨论】:
我收到此错误: 无法截断表 'dbo.TBL#EstenadeGhanooni',因为它被外键约束引用。 执行此代码后:EXEC sp_MSForEachTable
'TRUNCATE TABLE ?' -- 禁用所有约束 EXEC sp_msforeachtable
"ALTER TABLE ? NOCHECK CONSTRAINT all" -- 删除所有表中的数据 EXEC sp_MSForEachTable
"DELETE FROM ?" -- 启用所有约束 EXEC sp_msforeachtable
"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- EXEC sp_MSforeachtable "DBCC CHECKIDENT ('?', RESEED, 0)" 有什么问题?
在不丢弃 FK 的情况下没有办法。尽管this answer 表明可以通过NOCHECK CONSTRAINT ALL
禁用参照完整性来允许此has been closed as "Wont Fix" 的请求因此不会很快出现。上面链接的答案确实链接到包含脚本的文章,该脚本可能通过删除和重新创建 FK 来工作。
给我一个解决方案,从 0 重置所有表的自动增量(当它为空时)【参考方案3】:
我使用脚本
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
【讨论】:
【参考方案4】:重置自动增量?我不确定您是否正确理解它的工作原理。
主键递增由 SQL Server 使用 IDENTITY
规范处理。如果您的表中没有数据,它将始终从 0 开始。
如果我是你,我会翻阅你的编程书籍并学习一些基本的数据库知识,因为听起来你好像遗漏了一些基本事实。
【讨论】:
这是不正确的。主键不一定必须是 IDENTITY 列。此外,正如您所说,IDENTITY 列并不总是从 0 开始。它将从指定的种子值开始。以上是关于在 SQL Server 2005 中截断数据库的所有表的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2005 DTS导入平面数据源时(如txt文档),总是被截断,无法执行的错误解决方案