Sql 清除/重置所有自动递增主键

Sql 清除/重置所有自动递增主键,sql,sql-server,Sql,Sql Server,在SQLServer(2005+)中,我有一个与web应用程序集成的完全工作的数据库。 数据库由视图、键、索引、存储过程等组成 大多数(如果不是所有的话)表都有自动递增主键。是否有一个SQL脚本来清理(重置)所有主字段,使它们看起来更好(1、2、3、4、5、6等)?考虑到任何相关外键的一致性 除了组织数据之外,没有真正的动机来这样做。您可以使用以下代码重新设定值: DECLARE @MaxID INT SELECT @MaxID = MAX(ID) FROM <TableName>

在SQLServer(2005+)中,我有一个与web应用程序集成的完全工作的数据库。 数据库由视图、键、索引、存储过程等组成

大多数(如果不是所有的话)表都有自动递增主键。是否有一个SQL脚本来清理(重置)所有主字段,使它们看起来更好(1、2、3、4、5、6等)?考虑到任何相关外键的一致性


除了组织数据之外,没有真正的动机来这样做。

您可以使用以下代码重新设定值:

DECLARE @MaxID INT
SELECT @MaxID = MAX(ID)
FROM <TableName>
DBCC CHECKIDENT('<TableName>', RESEED, @MaxID)
DECLARE@MaxID INT
选择@MaxID=MAX(ID)
从…起
DBCC CHECKIDENT(“”,重新设定种子,@MaxID)

您可以使用以下代码重新设定值的种子:

DECLARE @MaxID INT
SELECT @MaxID = MAX(ID)
FROM <TableName>
DBCC CHECKIDENT('<TableName>', RESEED, @MaxID)
DECLARE@MaxID INT
选择@MaxID=MAX(ID)
从…起
DBCC CHECKIDENT(“”,重新设定种子,@MaxID)

甚至不要考虑这样做。(是的,我知道我在大喊大叫。)这并不会使数据库更有条理,使其更有可能出现数据完整性问题,更有可能出现性能问题,并在进行对任何人都没有好处的表面更改时束缚用户。随着时间的推移,数据库将有间隙,这是一件好事,因为间隙来自已删除的记录和已回滚的记录。当多个用户同时执行事务时,它有助于使数据库保持同步。它保持了数据的完整性。此外,除了您不喜欢它的外观之外,您似乎没有这样做的要求。如果我真的被要求做如此愚蠢的事情,我会把它寄回去,除非法律要求改变

甚至不要考虑这样做。(是的,我知道我在大喊大叫。)这并不会使数据库更有条理,它更可能出现数据完整性问题,更可能出现性能问题,并在您进行对任何人都没有好处的表面更改时束缚用户。随着时间的推移,数据库将有间隙,这是一件好事,因为间隙来自已删除的记录和已回滚的记录。当多个用户同时执行事务时,它有助于使数据库保持同步。它保持了数据的完整性。此外,除了您不喜欢它的外观之外,您似乎没有这样做的要求。如果我真的被要求做如此愚蠢的事情,我会把它寄回去,除非法律要求改变

您可以将FKs设置为更新级联,计算密钥需要如何更改,但正如HLGEM指出的那样,没有理由也有很多理由不这样做。如果您不愿意在一个单独的数据库上重新创建所有内容并从头开始移植,那么就不用麻烦了。在任何情况下,您都需要一些令人信服的理由来更新PKs,尤其是基于身份的PKs。

您可以将FKs设置为更新级联,计算密钥需要如何更改,但正如HLGEM指出的那样,没有理由也有很多理由不这样做。如果您不愿意在一个单独的数据库上重新创建所有内容并从头开始移植,那么就不用麻烦了。在任何情况下,尤其是基于身份的情况下,您都需要一些令人信服的理由来更新PKs。

我想问,为什么这会增加“组织”?如果这些关系是有效的,那对我来说似乎很有条理。除了joins,没有人看到自动编号字段,因为例如,我希望看到近似有效的计数。在我的例子中,FieldID可以是4000,而我在表中只有700条记录,这不是一个简单的方法。您必须重新创建所有表。每个表的过程都是创建新表、传输数据、删除旧FK、删除旧表、重命名新表、创建新键。不管你有什么理由(而且你提到的理由不是很好),这都不值得。如果你需要记录计数,只需从表中选择计数(*)。这是一个廉价的操作,没有周期性地重新编号ID的讨厌的开销。@Dreamer听起来好像OP想要保留现有数据,只需将所有ID推到编号的前面,scaleI会问为什么这会增加“组织”?如果这些关系是有效的,那对我来说似乎很有条理。除了joins,没有人看到自动编号字段,因为例如,我希望看到近似有效的计数。在我的例子中,FieldID可以是4000,而我在表中只有700条记录,这不是一个简单的方法。您必须重新创建所有表。每个表的过程都是创建新表、传输数据、删除旧FK、删除旧表、重命名新表、创建新键。不管你有什么理由(而且你提到的理由不是很好),这都不值得。如果你需要记录计数,只需从表中选择计数(*)。这是一个廉价的操作,没有周期性地重新编号ID的讨厌的开销。@Dreamer听起来好像OP想要保留现有数据,只需将所有ID推到数字刻度的前面。这只需重置下一个ID的数量以匹配最大ID(+1)。这只需重置下一个ID的数量以匹配最大ID(+1)。+1(如果可以的话,请多说)我试过一次,以后再也不会这样做了。不值得冒数据完整性丢失的风险。告诉要求您这样做的人,自动递增键既不能保证从1开始,也不能保证是连续的。+1(如果可以,请多说)我试过一次,以后再也不会这样做了。不值得冒数据完整性丢失的风险。告诉要求您这样做的人,自动递增键既不能保证从1开始,也不能保证连续。