我有一个包含三列ID, Name, Designation
的表,其中列ID
是主键,其身份规范已启用,它的种子为1。
假设表格中有10行。在ID
列的序列中,序列值为
1,2,3......10.
并且用户删除第10行然后插入我要插入的新行将具有11作为ID
列的值。如何增加最后一行值?我的意思是我希望“10”作为新行的值,然后才能将列ID
的值设置为9。
我不想使用SQL Server的MAX
功能,我想让它自动递增。有没有办法实现这个目标?
P.S:我正在使用Entity框架在DB中插入值。
答案 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