使用MSSQL2005,如果我首先截断子表(具有FK关系的主键的表),我可以截断带有外键约束的表吗?

我知道我也可以

使用不带where子句的DELETE,然后RESEED标识(或) 删除FK,截断表,并重新创建FK。

我认为只要我在父表之前截断子表,我就可以不做上面的任何一个选项,但我得到了这个错误:

不能截断表'TableName',因为它被一个FOREIGN KEY约束引用。


当前回答

如果我理解正确的话,您要做的是为涉及集成测试的DB设置一个干净的环境。

我在这里的方法是放弃整个模式,稍后再重新创建它。

原因:

您可能已经有了“创建模式”脚本。重用它进行测试隔离很容易。 创建模式非常快。 使用这种方法,可以很容易地设置脚本,让每个fixture创建一个NEW模式(使用临时名称),然后开始并行运行测试fixture,使测试套件中最慢的部分更快。

其他回答

如果这些答案都不像我的情况那样有效,那就这样做:

减少约束 将所有值设置为允许为空 截断表 添加已删除的约束。

好运!

在使用delete语句删除表中的所有行之后,使用以下命令

delete from tablename

DBCC CHECKIDENT ('tablename', RESEED, 0)

编辑:修正的SQL Server语法

在SSMS中,我打开了显示密钥的图表。在删除Key和截断文件之后,我刷新了,然后专注于图表,并通过清除和恢复标识框创建了一个更新。保存关系图会出现一个保存对话框,然后出现“当您在工作时,数据库中发生了更改”对话框,单击Yes恢复了密钥,从关系图中的锁定副本恢复它。

如果我理解正确的话,您要做的是为涉及集成测试的DB设置一个干净的环境。

我在这里的方法是放弃整个模式,稍后再重新创建它。

原因:

您可能已经有了“创建模式”脚本。重用它进行测试隔离很容易。 创建模式非常快。 使用这种方法,可以很容易地设置脚本,让每个fixture创建一个NEW模式(使用临时名称),然后开始并行运行测试fixture,使测试套件中最慢的部分更快。

截断不适合我,删除+重新播种是最好的方法。 如果你们中的一些人需要遍历大量的表来执行delete + reseed,你可能会遇到一些没有标识列的表的问题,下面的代码在尝试重新播种之前检查标识列是否存在

EXEC ('DELETE FROM [schemaName].[tableName]')
IF EXISTS (Select * from sys.identity_columns where object_name(object_id) = 'tableName')
BEGIN
    EXEC ('DBCC CHECKIDENT ([schemaName.tableName], RESEED, 0)')
END