首页 新闻 会员 周边

C# 自动有序号编号怎么生成?

0
悬赏园豆:10 [待解决问题]

比如有记录编码为 1、2、3、4、5 。。。。。

用户添加记录折时候数据库查出最大编号加1呈现在页面上,但如果多个用户同时添加,假设他们都为 5,第一个用户保存后,那么其它用户就不能再用 5 来编码了。

别外,如果编码中间删除了条记录

变成 1、2、4、5.。。。。

新记录添加的时候自动编码为3 ,也就是说编码是要连续的。

这个功能,有没有什么好的想法?

怎么实现

wunaigong的主页 wunaigong | 初学一级 | 园豆:4
提问于:2012-07-15 17:35
< >
分享
所有回答(9)
1

用事务解决多用户同时添加,如果中间删除了3,可以用row_number()来判断

select r from (select r=row_number() over(order by id), id from tb) as t where r != id

名字已被占用 | 园豆:41 (初学一级) | 2012-07-15 19:04
0

(1)用lock(object)方式解决并发问题,将上面的逻辑放到lock(object)内部

(2)可以考虑增加一个GUID字段,使用这个GUID字段做为记录标识,这个是不会重复的

johden2 | 园豆:352 (菜鸟二级) | 2012-07-16 07:10
0

说实话,这样的做法真的挺影响性能的,如果对性能没有什么要求,那就做吧。

chenping2008 | 园豆:9836 (大侠五级) | 2012-07-16 09:31
0

删除前把逻辑处理好。 专有排序字段。

xinsiyus | 园豆:153 (初学一级) | 2012-07-16 16:58
0

好奇为什么一定要把数据库里面设置成这样有序的,只要再前台表现的时候自动有序排序不行么?这种需求一般什么时候会碰到呢?

cx199055 | 园豆:4 (初学一级) | 2012-07-16 17:35
0

我一直也搞不清楚这个号是干什么用的。如果业务要求这样,那么:

获取最大号与数据总量,如果这两个数相同,那么在此基础上加1;如果不如,用折半查找空位号,返回。

整个地程锁表执行。

还有种方法好一点。新建个表A,每在主表中删除一条数据,就在表A中加上被删除数据的这个编号。当有新数据添加时,先在表A中看看有现成的号用没,没有就取主表中最大号+1

幽灵~ | 园豆:268 (菜鸟二级) | 2012-07-17 09:51
0

编号自增就行了,别瞎折腾一定要编号连续了,中间几个被删除了,又填回去没有多少实际意义,相反有时候从数据严谨设计出发,上倒是会有问题;

八戒的师傅 | 园豆:1472 (小虾三级) | 2012-07-17 19:47
0

这个问题貌似比较难办,其实也有一个很好的办法,建立一个标志删除的字段 如  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
Shannon | 园豆:611 (小虾三级) | 2012-07-18 09:19
0

一个很笨的办法,会有不好的地方,但是也能解决你现在的问题,你在数据库里去取你当前数字然后+1就可以。比如:当前字段是int类型的,你在添加的时候,先取这个 数据库 当前数据,然后+1,如果为空就是o,0+1=1,然后1+1=2 ,....

沉枫 | 园豆:202 (菜鸟二级) | 2012-07-27 14:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册