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

表中的id是这样的:

99 100 101 1200 1201...

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


当前回答

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

IDs:

99 100 101 1200 1201...

删除id为>= 1200的行。(如果你有外键约束绑定到这些必须处理或删除,也能够删除这个,请小心。) 现在你要确保你知道MAX ID,以确保:

(SELECT MAX(your_column_name) FROM your_table) + 1;

(注:+1为最大值后开始ID序列)

重新启动你的序列:

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

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

其他回答

一些答案建议使用这样的语句:

DBCC CHECKIDENT (mytable, RESEED, 0)

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

DBCC CHECKIDENT (mytable)

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

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

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。

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

IDs:

99 100 101 1200 1201...

删除id为>= 1200的行。(如果你有外键约束绑定到这些必须处理或删除,也能够删除这个,请小心。) 现在你要确保你知道MAX ID,以确保:

(SELECT MAX(your_column_name) FROM your_table) + 1;

(注:+1为最大值后开始ID序列)

重新启动你的序列:

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

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

这个呢?

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;

如果你正在使用MySQL,试试这个:

ALTER TABLE tablename AUTO_INCREMENT = 1