今天一个同学在弄一个程序的时候想要初始化所有新建的表,决定使用truncate table xx来进行初始化,但始终报外间约束,初始化失败,奇怪,难道没有将主表关联的
其他表的记录删除吗,查看后将所有关联的表删除后,重新初始化该表,发现还是报同样了错,这是有点纳闷了,试了下delete xx是可以删除的
带着疑问网上搜了下,原来有外键关联的表确实不能进行初始化:
1.由 FOREIGN KEY 约束引用的表。
2.参与索引视图的表。
3.通过使用事务复制或合并复制发布的表。
对于具有以上一个或多个特征的表,使用 DELETE 语句,不能使用truncate,除非先将外键约束暂时去掉。但delete的话,不能将自增的id进行初始化。
但有时候对自增的id值进行初始化还是有必要的,这是我们就必须使用DBCC CHECKIDENT
检查指定表的当前标识值,如有必要,还对标识值进行更正。
语法
DBCC CHECKIDENT
( 'table_name'
[ , { NORESEED
| { RESEED [ , new_reseed_value ] }
}
]
)
如果标识列上有主键或唯一键约束,
使用DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 当前值设置为new_reseed_value,这个时候需要注意:new_reseed_value 的值应该取当前标识列中的最大值,避免插入错误。
示例:
表:
其中ID是递增的列,现在在查询分析器中运行以下语句将当前标识值改为10,
USE 数据库名
GO
DBCC CHECKIDENT (表名, RESEED, 10)
GO
可以发现自增的ID从11开始了,因此我们可以使用这种方式将自增ID进行初始化:
1.先将该表中的所有记录进行删除
2.执行
USE 数据库名
GO
DBCC CHECKIDENT (表名, RESEED, 0)
GO