清除表中的所有行,将标识规范重置为零并且不影响外键?
Posted
技术标签:
【中文标题】清除表中的所有行,将标识规范重置为零并且不影响外键?【英文标题】:Clear all the rows in a table resetting the identity specification back to zero and without affecting the foreign keys? 【发布时间】:2009-12-23 09:55:48 【问题描述】:我们已经创建了包含所有关系和依赖关系的数据库框架。但是表格里面只是虚拟数据,我们需要摆脱这些虚拟数据,并开始添加正确的数据。我们如何才能清除所有内容并将主键(IsIdentity:是)归零,同时又不影响外部表关系结构。
非常感谢!
【问题讨论】:
【参考方案1】:您可以采取以下步骤:
-- disable all foreign key constraints
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
-- delete data in all tables
EXEC sp_MSForEachTable "DELETE FROM ?"
-- enable all constraints
exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
更多关于禁用约束和触发器here
如果某些表有标识列,我们可能需要重新设置它们的种子
EXEC sp_MSforeachtable "DBCC CHECKIDENT ( '?', RESEED, 0)"
注意 RESEED 的行为在全新表和之前从 BOL 插入的某个日期之间有所不同:
DBCC CHECKIDENT ('table_name', RESEED, newReseedValue)
当前标识值设置为 新的ReseedValue。如果没有行 自从它被插入到表中 已创建,插入的第一行 执行 DBCC CHECKIDENT 后会 使用 newReseedValue 作为标识。 否则,插入的下一行将 使用 newReseedValue + 1。如果值 newReseedValue 的值小于 标识列中的最大值, 将生成错误消息 2627 以后对表格的引用。
【讨论】:
【参考方案2】:重新播种:
DBCC CHECKIDENT (yourtable, reseed, 1)
用于在1上设置主键
delete from table 应该删除数据,但不影响其他任何事情。
【讨论】:
DELETE 语句与 REFERENCE 约束“FK_BlahAbcs_AnotherBlah”冲突。我们如何避免这种情况? 像 Christof 那样暂时禁用约束。【参考方案3】:使用 Database publishing wizard 生成仅数据库模式的 sql 文件,并启用删除表(如果存在)的选项。在您的数据库上运行此脚本,这将刷新所有内容并根据需要为您提供新的架构。
【讨论】:
听起来很有希望...但是我们如何或在哪里可以找到发布向导? =) 这里 - microsoft.com/downloads/… 探索非常规的方法以获得更有希望的结果!【参考方案4】:我会使用 TRUNCATE:
-- Truncate table (very fast, and it resets Identity as well)
EXEC sp_MSForEachTable "TRUNCATE TABLE ?"
当然,也可以按照 kristof 的建议禁用和重新启用检查约束。
【讨论】:
截断是否也会重置身份? 正如我在原始答案中所写,是的(DELETE
命令却没有)。以上是关于清除表中的所有行,将标识规范重置为零并且不影响外键?的主要内容,如果未能解决你的问题,请参考以下文章