我已经从 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
DBCC CHECKIDENT('databasename.dbo.tablename')
并且 NOT 是否包含 , RESEED, number
?
半白痴:
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
-方法会产生问题。使用它来确保:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
如果要检查操作是否成功,请使用
SELECT IDENT_CURRENT(@Table);
在上面的示例中应该输出 0
。
您一般不希望这样做。 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;
要将数据库中的每个键重置为从最后一个最高键的最大值自动递增:
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)'
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED)'
如果您只想重置主键/序列以在 SQL 服务器中以您想要的序列开头,这里是解决方案 -
标识:
99 100 101 1200 1201...
删除 ID >= 1200 的行。(如果您有与这些相关的外键约束,必须处理或删除这些约束才能删除它。)现在您要确保您知道 MAX ID 为当然:
将@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 开头。
我知道这是一个老问题。但是,我正在为 MySQL 寻找类似的解决方案,并且出现了这个问题。
对于那些正在寻找 MySQL 解决方案的人,您需要运行以下查询:
// important!!! You cannot reset the counter to a value less than or equal to the value that is currently in use. For both InnoDB and MyISAM, if the value is less than or equal to the maximum value currently in the AUTO_INCREMENT column, the value is reset to the current maximum AUTO_INCREMENT column value plus one.
ALTER TABLE <your-table-name> AUTO_INCREMENT = 100
DBCC CHECKIDENT (mytable, RESEED, 0)