我从SQL Server数据库中的表中删除了一些记录。现在ID从101到1200.我想再次删除记录,但我希望ID能够回到102.有没有办法在SQL Server中执行此操作?
发出以下命令重新设置mytable以从1开始:
DBCC CHECKIDENT (mytable, RESEED, 0)
在线上书籍(BOL,SQL帮助)中阅读它。另外请注意,您没有比您设置的种子更高的记录。
我想添加这个答案,因为当你使用表格的模式时,DBCC CHECKIDENT
方法会产生问题。使用这个来确定:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
如果要检查操作是否成功,请使用
SELECT IDENT_CURRENT(@Table);
在上面的例子中应该输出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;
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.
我想到了。它的:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
基于已接受的答案,对于遇到类似问题的人,具有完整的架构资格:
([MyDataBase].[MySchemaName].[MyTable]
)...导致错误,您需要在该数据库的上下文中
也就是说,以下内容将引发错误:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
用单引号括起完全限定的表名:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
几个答案建议使用如下语句:
DBCC CHECKIDENT (mytable, RESEED, 0)
但是OP说“删除了一些记录”,这可能不是全部,所以值0并不总是正确的。另一个答案建议自动找到最大当前值并重新接种到该值,但如果表中没有记录则会遇到麻烦,因此max()将返回NULL。评论建议使用简单
DBCC CHECKIDENT (mytable)
重置该值,但另一条评论正确地指出,这只会将值增加到表中已有的最大值;如果它已经高于表中的最大值,这将不会减少该值,这是OP想要做的。
更好的解决方案结合了这些想法第一个CHECKIDENT将值重置为0,第二个将其重置为当前表中的最高值,以防表中有记录:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
正如多条注释所示,请确保其他表中没有指向已删除记录的外键。否则,这些外键将指向您重新播种表后创建的记录,这几乎肯定不是您的想法。
你一般不想这样做。 Reseed可以创建数据完整性问题。它实际上只适用于您正在擦除所有测试数据并重新开始的开发系统。如果没有删除所有相关记录,则不应在生产系统上使用它(不是每个应该在外键关系中的表都是!)。你可以创建一个混乱,特别是如果你想在每次删除后定期这样做。担心身份字段值存在差距是个坏主意。