用事务解决多用户同时添加,如果中间删除了3,可以用row_number()来判断
select r from (select r=row_number() over(order by id), id from tb) as t where r != id
(1)用lock(object)方式解决并发问题,将上面的逻辑放到lock(object)内部
(2)可以考虑增加一个GUID字段,使用这个GUID字段做为记录标识,这个是不会重复的
说实话,这样的做法真的挺影响性能的,如果对性能没有什么要求,那就做吧。
删除前把逻辑处理好。 专有排序字段。
好奇为什么一定要把数据库里面设置成这样有序的,只要再前台表现的时候自动有序排序不行么?这种需求一般什么时候会碰到呢?
我一直也搞不清楚这个号是干什么用的。如果业务要求这样,那么:
获取最大号与数据总量,如果这两个数相同,那么在此基础上加1;如果不如,用折半查找空位号,返回。
整个地程锁表执行。
还有种方法好一点。新建个表A,每在主表中删除一条数据,就在表A中加上被删除数据的这个编号。当有新数据添加时,先在表A中看看有现成的号用没,没有就取主表中最大号+1
编号自增就行了,别瞎折腾一定要编号连续了,中间几个被删除了,又填回去没有多少实际意义,相反有时候从数据严谨设计出发,上倒是会有问题;
这个问题貌似比较难办,其实也有一个很好的办法,建立一个标志删除的字段 如 IsDelete (Bit类型) ,建立一个自动ID,自动增长为1,每次删除的时候只把IsDelete 标记为True 就好,没必要彻底删除数据(当然呈现给用户看的时候需要筛选一下),下次需要新增数据的时候,先检查IsDelete 为True的数据是否存在记录,如果存在,则按照自动ID从小到大更新,如果不存在 IsDelete 为True的记录 ,则直接新增
大概代码
If Exists(Select Count(1) From Table1 Where IsDelete=1) Update Table1 Set XXX=@XXX,YYY=@YYY,IsDelete=0 -- OUTPUT inserted.ID 如果有需要看看更新的是那个ID 则用Output Where ID=(Select Min(ID) From Table1 Where IsDelete=1) Else Insert into Table1 (XXX,YYYY) -- OUTPUT inserted.ID 如果有需要看看新增的是那个ID 则用Output SELECT @XXX,@YYYY
一个很笨的办法,会有不好的地方,但是也能解决你现在的问题,你在数据库里去取你当前数字然后+1就可以。比如:当前字段是int类型的,你在添加的时候,先取这个 数据库 当前数据,然后+1,如果为空就是o,0+1=1,然后1+1=2 ,....