我从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?
当前回答
如果你只是想在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('databasename.dbo.tablename', RESEED, number)
如果number = 0,那么在下一次插入时,自动递增字段将包含值1
如果number = 101,那么在下一次插入时,自动递增字段将包含值102
一些额外的信息…可能对你有用 在上述查询中给出自动递增数之前,必须确保现有表的自动递增列包含的值小于该数。
要从表(table1)中获取列(column_name)的最大值,可以使用以下查询
SELECT MAX(column_name) FROM table1
You do not want to do this in general. Reseed can create data integrity problems. It is really only for use on development systems where you are wiping out all test data and starting over. It should not be used on a production system in case all related records have not been deleted (not every table that should be in a foreign key relationship is!). You can create a mess doing this and especially if you mean to do it on a regular basis after every delete. It is a bad idea to worry about gaps in you identity field values.
我想明白了。它是:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
如果你只是想在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)
正如多条注释所指出的,确保其他表中没有指向已删除记录的外键。否则,这些外键将指向您在重新播种表后创建的记录,这几乎肯定不是您想要的。