删除后重置SQL Server中的AutoIncrement

问题描述 投票:231回答:11

我从SQL Server数据库中的表中删除了一些记录。现在ID从101到1200.我想再次删除记录,但我希望ID能够回到102.有没有办法在SQL Server中执行此操作?

sql-server auto-increment delete-row
11个回答
415
投票

发出以下命令重新设置mytable以从1开始:

DBCC CHECKIDENT (mytable, RESEED, 0)

在线上书籍(BOL,SQL帮助)中阅读它。另外请注意,您没有比您设置的种子更高的记录。


2
投票

我想添加这个答案,因为当你使用表格的模式时,DBCC CHECKIDENT方法会产生问题。使用这个来确定:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

如果要检查操作是否成功,请使用

SELECT IDENT_CURRENT(@Table);

在上面的例子中应该输出0


0
投票

那这个呢?

ALTER TABLE `table_name`
  MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

这是一种将自动增量更改为0或任何所需数字的快速而简单的方法。我通过导出数据库并自己阅读代码来解决这个问题。

您也可以像这样编写它以使其成为单行解决方案:

ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

79
投票
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

如果number = 0,则在下一个插入中,自动增量字段将包含值1

如果number = 101,则在下一个插入中,自动增量字段将包含值102

一些额外的信息...可能对您有用 在上面的查询中给出自动增量number之前,您必须确保现有表的自动增量列包含的值小于number

要从表(table1)获取列(column_name)的最大值,可以使用以下查询

 SELECT MAX(column_name) FROM table1

34
投票

半白痴:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete


9
投票

试试这个:

ALTER TABLE tablename AUTO_INCREMENT = 1

6
投票

删除并重新设定数据库中的所有表。

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.

6
投票

我想到了。它的:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)

4
投票

基于已接受的答案,对于遇到类似问题的人,具有完整的架构资格:

[MyDataBase].[MySchemaName].[MyTable])...导致错误,您需要在该数据库的上下文中

也就是说,以下内容将引发错误:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

用单引号括起完全限定的表名:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)

3
投票

几个答案建议使用如下语句:

DBCC CHECKIDENT (mytable, RESEED, 0)

但是OP说“删除了一些记录”,这可能不是全部,所以值0并不总是正确的。另一个答案建议自动找到最大当前值并重新接种到该值,但如果表中没有记录则会遇到麻烦,因此max()将返回NULL。评论建议使用简单

DBCC CHECKIDENT (mytable)

重置该值,但另一条评论正确地指出,这只会将值增加到表中已有的最大值;如果它已经高于表中的最大值,这将不会减少该值,这是OP想要做的。

更好的解决方案结合了这些想法第一个CHECKIDENT将值重置为0,第二个将其重置为当前表中的最高值,以防表中有记录:

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

正如多条注释所示,请确保其他表中没有指向已删除记录的外键。否则,这些外键将指向您重新播种表后创建的记录,这几乎肯定不是您的想法。


2
投票

你一般不想这样做。 Reseed可以创建数据完整性问题。它实际上只适用于您正在擦除所有测试数据并重新开始的开发系统。如果没有删除所有相关记录,则不应在生产系统上使用它(不是每个应该在外键关系中的表都是!)。你可以创建一个混乱,特别是如果你想在每次删除后定期这样做。担心身份字段值存在差距是个坏主意。

© www.soinside.com 2019 - 2024. All rights reserved.