删除后重置SQL Server中的自动增量
我从SQL Server数据库的表中删除了一些logging。 现在ID从101到1200.我想再次删除logging,但我想要的ID回到102.是否有办法在SQL Server中这样做?
发出以下命令以使mytable变为从1开始:
DBCC CHECKIDENT (mytable, RESEED, 0)
请阅读“在线图书”(BOL,SQL帮助)。 另外要小心,你没有比你设定的种子更高的logging。
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
如果number = 0,则在下一次插入时,自动增加字段将包含值1
如果number = 101,那么在下一个插入时,自动增加字段将包含值102
一些额外的信息…可能对你有用
在给出上述查询中的自动增量number
之前,必须确保现有表的自动增量列包含的值小于该number
。
要从表(table1)中获取列(column_name)的最大值,可以使用以下查询
SELECT MAX(column_name) FROM table1
半防白痴:
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
尝试这个:
ALTER TABLE tablename AUTO_INCREMENT = 1
删除和重新调整数据库中的所有表。
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.
根据已被接受的答案,对于遇到类似问题的人,具有完整的模式限定:
( [MyDataBase].[MySchemaName].[MyTable]
)…导致错误,您需要在该DB的上下文中
也就是说,下面会抛出一个错误:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
用单引号括起完全限定的表名:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
一般来说,你不想这样做。 Reseed可以创build数据完整性问题。 它只是用于开发系统,在这个系统中,你正在清除所有的testing数据并重新开始。 如果所有相关logging都没有被删除(不是每个应该处于外键关系的表都是!),它不应该被用在生产系统上。 你可以创build一个混乱做这个,特别是如果你的意思是在每次删除后定期做。 担心身份领域价值观的差距是一个糟糕的主意。
我想到了。 它的:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
几个答案build议使用这样的陈述:
DBCC CHECKIDENT (mytable, RESEED, 0)
但是OP表示“删除了一些logging”,可能不是全部,所以0的值并不总是正确的。 另一个答案build议自动find最大的当前值并重新编译到那个,但是如果表中没有logging就会遇到麻烦,因此max()将返回NULL。 build议使用简单的评论
DBCC CHECKIDENT (mytable)
重置值,但另一个评论正确地表示,这只会增加到已经在表中的最大值; 如果它已经高于表中的最大值,那么这个值就不会降低,这是OP想要做的。
更好的解决scheme结合了这些观点 第一个CHECKIDENT将值重置为0,第二个重置为当前表中最高值,以防表中有logging:
DBCC CHECKIDENT (mytable, RESEED, 0) DBCC CHECKIDENT (mytable)
正如多个注释所示,确保其他表中没有指向已删除logging的外键。 否则,这些外键将指向您重新创build表后创build的logging,这几乎不是您想要的。
我想添加此答案,因为DBCC CHECKIDENT
-approach将产生问题,当您使用模式的表。 用这个来确定:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable'; DBCC CHECKIDENT (@Table, RESEED, 0);
如果要检查操作是否成功,请使用
SELECT IDENT_CURRENT(@Table);
在上面的例子中应该输出0
。