310

我已经从 SQL Server 数据库的表中删除了一些记录。

表中的 ID 如下所示:

99 100 101 1200 1201...

我想删除后面的记录(ID > 1200),然后我想重置自动增量,以便下一个自动生成的 ID 为 102。所以我的记录是连续的,有没有办法在 SQL Server 中做到这一点?

4

13 回答 13

521

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

DBCC CHECKIDENT (mytable, RESEED, 0)

在在线书籍(BOL、SQL 帮助)中阅读有关它的信息。另请注意,您的记录不要高于您设置的种子。

于 2009-02-04T05:05:24.347 回答
102
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

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

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


一些附加信息... 可能对您有用

在上述查询中给出自动增量之前number,您必须确保现有表的自动增量列包含的值小于number.

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

 SELECT MAX(column_name) FROM table1
于 2012-06-20T08:09:11.120 回答
46

半白痴:

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

于 2012-05-01T18:31:28.263 回答
22

如果您使用的是 MySQL,请尝试以下操作:

ALTER TABLE tablename AUTO_INCREMENT = 1
于 2013-06-28T10:52:46.113 回答
9

我想到了。它的:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
于 2009-02-04T05:12:06.067 回答
7

删除并重新设置数据库中的所有表。

    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.
于 2014-03-17T07:59:53.817 回答
6

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

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

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

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

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

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
于 2016-04-07T12:58:01.087 回答
6

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

DBCC CHECKIDENT (mytable, RESEED, 0)

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

DBCC CHECKIDENT (mytable)

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

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

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

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

于 2017-04-02T20:59:58.163 回答
4

我想添加这个答案,因为DBCC CHECKIDENT当您将模式用于表时,-approach 会产生问题。使用它来确保:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

如果要检查操作是否成功,请使用

SELECT IDENT_CURRENT(@Table);

应该0在上面的示例中输出。

于 2017-10-21T09:47:44.463 回答
1

您一般不希望这样做。Reseed 会造成数据完整性问题。它实际上仅适用于您要清除所有测试数据并重新开始的开发系统。如果尚未删除所有相关记录,则不应在生产系统上使用它(并非每个应具有外键关系的表!)。这样做可能会造成混乱,特别是如果您打算在每次删除后定期执行此操作。担心身份字段值的差距是个坏主意。

于 2009-02-05T19:09:57.370 回答
1

要将数据库中的每个键重置为从最后一个最高键的最大值自动递增:

Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)'

Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED)'
于 2021-10-30T22:00:20.530 回答
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;
于 2019-03-05T00:17:01.607 回答
0

如果您只想重置主键/序列以在 SQL 服务器中以您想要的序列开头,这里是解决方案 -

标识:

99 100 101 1200 1201...

  1. 删除 ID >= 1200 的行。(如果您有与这些相关的外键约束,必须处理或删除这些约束才能删除它。)
  2. 现在您要确保您知道 MAX ID 以确保:

将@max_id 声明为 int = (SELECT MAX( your_column_name ) FROM your_table )+1;

(注:+1 表示最大值后的 ID 序列)

  1. 重新启动您的序列:

exec('alter sequence your_column_name restart with ' + @max_id);

(注意:with 后面的空格是必须的) 现在新记录将以102作为 ID 开头。

于 2021-06-11T16:56:13.713 回答