如何停止主键标识列跳过缺失值

时间:2013-10-12 08:32:45

标签: asp.net sql sql-server database sql-server-2008

我有一个包含三列ID, Name, Designation的表,其中列ID是主键,其身份规范已启用,它的种子为1。

假设表格中有10行。在ID列的序列中,序列值为

1,2,3......10. 

并且用户删除第10行然后插入我要插入的新行将具有11作为ID列的值。如何增加最后一行值?我的意思是我希望“10”作为新行的值,然后才能将列ID的值设置为9。

我不想使用SQL Server的MAX功能,我想让它自动递增。有没有办法实现这个目标?

P.S:我正在使用Entity框架在DB中插入值。

4 个答案:

答案 0 :(得分:0)

你可以手动完成。

  

步骤1:删除主键中的IsIdentity =“ON”(或将IsIdentity设置为OFF)

     

步骤2:使用EF查询获取表中的Last Row,并在将数据保存到数据库时获取主键列值。 (Load most recent related entity record on a list of entities in a single query

     

步骤3:现在,如果最后一行主键值为9,那么您可以使用该值添加+1并使用primarykey列值存储新值为10,

答案 1 :(得分:0)

对于喜欢危险生活的男人或女人来说,可能,尽管不明智重新设置身份栏。

TSQL是

dbcc checkident ([tableName], reseed, [previousHighestID])

鉴于下表:

create table x ( a int identity(1,1), y varchar(max) )

实体框架:

using (var context = new XContext())
{
    context.Database.SqlCommand("insert into x select 'abc'");//id 1
    context.Database.SqlCommand("insert into x select 'cba'");//id 2
    context.Database.SqlCommand("delete from x where a = 2");//delete id 2
    context.Database.SqlCommand("declare @identMax int; select @identMax = max(a) from x; dbcc checkident (x, reseed, @identMax)");
    //reseed identity to 1 ( so next insert will be id 2 )
    context.Database.SqlCommand("insert into x select 'def'");//id 2 (again!)
    var X = context.X.SqlQuery("select * from x").ToList();    
}

真的不要担心一些缺失值。 int或bigint列可以表示很多值。

我想起了杰克汉迪的深思:

“如果你将钥匙放入熔岩中,就让他们去吧,男人,    他们走了。“

答案 2 :(得分:0)

您希望回收标识/自动递增字段的唯一时间是该字段的值几乎耗尽或值严重碎片化时。

答案 3 :(得分:-1)

如果你有一个标识列,你不能这样做,你想要做的插入是一次性的事情..然后你可以尝试:

SET IDENTITY_INSERT XXX ON
GO

-- INSERT WITH THE IDENTITY VALUE YOU WANT

SET IDENTITY_INSERT XXX OFF
GO