我已经从 SQL Server 数据库的表中删除了一些记录。
表中的 ID 如下所示:
99 100 101 1200 1201...
我想删除后面的记录(ID > 1200),然后我想重置自动增量,以便下一个自动生成的 ID 为 102。所以我的记录是连续的,有没有办法在 SQL Server 中做到这一点?
我已经从 SQL Server 数据库的表中删除了一些记录。
表中的 ID 如下所示:
99 100 101 1200 1201...
我想删除后面的记录(ID > 1200),然后我想重置自动增量,以便下一个自动生成的 ID 为 102。所以我的记录是连续的,有没有办法在 SQL Server 中做到这一点?
发出以下命令以重新设置 mytable 以从 1 开始:
DBCC CHECKIDENT (mytable, RESEED, 0)
在在线书籍(BOL、SQL 帮助)中阅读有关它的信息。另请注意,您的记录不要高于您设置的种子。
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
如果您使用的是 MySQL,请尝试以下操作:
ALTER TABLE tablename AUTO_INCREMENT = 1
我想到了。它的:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
删除并重新设置数据库中的所有表。
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]
)... 导致错误,您需要在该数据库的上下文中
也就是说,以下将引发错误:
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)
正如多条评论所指出的,确保其他表中没有指向已删除记录的外键。否则,这些外键将指向您在重新设置表后创建的记录,这几乎肯定不是您的想法。
我想添加这个答案,因为DBCC CHECKIDENT
当您将模式用于表时,-approach 会产生问题。使用它来确保:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
如果要检查操作是否成功,请使用
SELECT IDENT_CURRENT(@Table);
应该0
在上面的示例中输出。
您一般不希望这样做。Reseed 会造成数据完整性问题。它实际上仅适用于您要清除所有测试数据并重新开始的开发系统。如果尚未删除所有相关记录,则不应在生产系统上使用它(并非每个应具有外键关系的表!)。这样做可能会造成混乱,特别是如果您打算在每次删除后定期执行此操作。担心身份字段值的差距是个坏主意。
要将数据库中的每个键重置为从最后一个最高键的最大值自动递增:
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)'
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED)'
那这个呢?
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;
如果您只想重置主键/序列以在 SQL 服务器中以您想要的序列开头,这里是解决方案 -
标识:
99 100 101 1200 1201...
将@max_id 声明为 int = (SELECT MAX( your_column_name ) FROM your_table )+1;
(注:+1 表示最大值后的 ID 序列)
exec('alter sequence your_column_name restart with ' + @max_id);
(注意:with 后面的空格是必须的) 现在新记录将以102作为 ID 开头。