删除后重置SQL Server中的AutoIncrement

jum*_*ojs 245 sql-server auto-increment delete-row

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

Rob*_*ner 428

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

DBCC CHECKIDENT (mytable, RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

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

  • "DBCC CHECKIDENT(table_name)"将种子设置为表中的最高标识,而不是"小心" (7认同)
  • @ user1027167不,你的答案对我不起作用.它一直在增加内部保存的最高ID.在我的情况下,我必须明确使用"RESEED,18"来获得"19"作为下一个ID.没有它继续愉快地增加"29". (4认同)
  • ...因为这些记录的ID会很高兴再次被重复使用,造成一个糟糕的混乱. (3认同)
  • 实际上,为了从1开始ID,你需要使用0:`DBCC CHECKIDENT(mytable,RESEED,0)` (3认同)

Fat*_*n P 80

DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
Run Code Online (Sandbox Code Playgroud)

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

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


一些额外的信息...可能对您有用在上面的查询中

给出自动增量之前number,您必须确保现有表的自动增量列包含的值小于该值number.

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

 SELECT MAX(column_name) FROM table1
Run Code Online (Sandbox Code Playgroud)


use*_*430 33

半白痴:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)
Run Code Online (Sandbox Code Playgroud)

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

  • @ user1027167文档说'如果表的当前标识值小于标识列中存储的最大标识值'; 删除数据后不包括清理(重新使用id - 通常是一个坏主意).在SQL 2008上验证 (2认同)

xaa*_*xaa 12

试试这个:

ALTER TABLE tablename AUTO_INCREMENT = 1
Run Code Online (Sandbox Code Playgroud)

  • 这是 MySQL 的答案。OP 正在询问 MSSQL。 (7认同)
  • 如果我没错,那么答案对于mysql来说是好的. (4认同)
  • 可能会,但答案仍然可以帮助像我这样的其他人。 (2认同)

jum*_*ojs 6

我想到了.它的:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
Run Code Online (Sandbox Code Playgroud)


BMG*_*BMG 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.
Run Code Online (Sandbox Code Playgroud)


use*_*426 6

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

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

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

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

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

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
Run Code Online (Sandbox Code Playgroud)


Mic*_*dby 5

几个答案建议使用这样的语句:

DBCC CHECKIDENT (mytable, RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

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

DBCC CHECKIDENT (mytable)
Run Code Online (Sandbox Code Playgroud)

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

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

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Run Code Online (Sandbox Code Playgroud)

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