清除表中的所有行,将标识规范重置为零并且不影响外键?

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 命令却没有)。

以上是关于清除表中的所有行,将标识规范重置为零并且不影响外键?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从表中删除所有行并将 ID 重置为零

如何重置/清除 x-editable 表中的所有过滤器(select2、select、input)?

如何从一个表中选择不在其他表中的所有行?

sqlserver学习

清除响应表中的 colspan

下列约束不属于实体完整性的是A.主键 B.标识列 C.外键 D. 以上不都是