关于truncate与checkident

今天一个同学在弄一个程序的时候想要初始化所有新建的表,决定使用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

 

 

posted on 2012-06-30 21:11  发表是最好的记忆  阅读(465)  评论(0编辑  收藏  举报