-2

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

假设我在表中有 10 行。在一个序列中,ID列的值是按顺序排列的

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

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

我不想使用MAXSQL Server 的功能,我希望它自动递增。有什么办法可以做到这一点?

PS:我正在使用实体框架在数据库中插入值。

4

4 回答 4

1

对于喜欢危险生活的人来说,这是可能的,尽管不建议重新设置身份栏。

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 列可以表示很多值。

我想起了 Jack Handy 的一个深刻想法:

“如果你把钥匙掉进熔岩里,就让它们走吧,伙计,它们已经不见了。”

于 2013-10-12T10:44:44.883 回答
0

你可以手动完成。

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

第2步:使用EF查询获取表中的最后一行,并在每次将数据保存到数据库时获取主键列值。(在单个查询中将最近的相关实体记录加载到实体列表中

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

于 2013-10-12T09:46:41.580 回答
0

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

于 2013-10-12T14:22:57.747 回答
-1

如果你有一个身份列,你不能这样做,除非你想做的插入是一次性的。那么你可以尝试:

SET IDENTITY_INSERT XXX ON
GO

-- INSERT WITH THE IDENTITY VALUE YOU WANT

SET IDENTITY_INSERT XXX OFF
GO
于 2013-10-12T08:39:49.427 回答