每条记录都有唯一的ID。
怎么获得新ID。
我的做法是获得最大的一条。然后尾数+1.例如:
JDSK0001000100010001
JDSK0001000100010002
JDSK0001000100010003
JDSK0001000100010004
JDSK0001000100010005
JDSK0001000100010006
会删除记录。
假如删除了JDSK0001000100010003。我的方法获得的ID是0007.而不是0003.
假如我中间删除的比较多的时候。那就会浪费很多ID。有什么语句,可以获得空缺的ID,如果没有就获取下一个ID。

解决方案 »

  1.   

    空缺就空缺,又不影响你的数据,再说,有空缺还能计算到删除过多少记录,为什么非要补上?
    去下一个id,加一个生成id的表,再写个函数生成id,每次插入数据,调用一次函数。id表加1
      

  2.   

    那可以考虑加一个删除的id的记录表,删除时将id记录下来,分配id时,从记录表的最小id开始分,
    性能会比较好,不过,多了一件事,要维护删除时将id记录下来,分配出去要及时清除.
      

  3.   


    有些时候,空缺的ID。可能是唯一判断数据是否被删除的依据。 
    如果仅仅是编号的问题。也还是建议LZ不要使用重复的编号,以防止新产生数据与未删除数据之间的重复问题。
      

  4.   


    declare @maxstr varchar(50);
    with cte as
    (
    select *,cast(right(strs,4) as int) row,row_number() over (order by cast(right(strs,4) as int)) rm from ddd
    )
    select top 1 @maxstr=strs from cte t
    where row=rm 
    order by rm descselect @maxstr;获取后,然后尾数+1.
      

  5.   

    添加一个辅助表,已删除表(id,flag)当删除记录时,查找已删除表此ID是否存在,若在,更改flag为0,表示可用,否则插入
    当新增记录是,查找已删除表flag=0的最小ID,若找到,则分配该ID,完成后更新flag=1
      

  6.   

    这种处理方式不可取.但程序好写:
    create table tb(id varchar(20))
    insert into tb select 'JDSK0001000100010001'
    insert into tb select 'JDSK0001000100010002'
    insert into tb select 'JDSK0001000100010003'
    insert into tb select 'JDSK0001000100010004'
    insert into tb select 'JDSK0001000100010005'
    insert into tb select 'JDSK0001000100010006'
    go
    select top 1 'JDSK000100010001'+right('0000'+convert(varchar,number),4) from master..spt_values a
    where type='p' and number>0 and not exists(
    select 1 from tb where convert(int,right(id,4))=a.number)
    /*
    ------------------------
    JDSK0001000100010007(1 行受影响)*/
    delete from tb where id='JDSK0001000100010003'
    go
    select top 1 'JDSK000100010001'+right('0000'+convert(varchar,number),4) from master..spt_values a
    where type='p' and number>0 and not exists(
    select 1 from tb where convert(int,right(id,4))=a.number)
    /*
    ------------------------
    JDSK0001000100010003(1 行受影响)*/go
    drop table tb
      

  7.   

    可以解释下么?
     master..spt_values a
    这个什么意思啊?
      

  8.   

    if exists
    (select top 1 id from tb a
    where (select top 1 cast(right(b.id,4) as int)-1 from tb b 
    where b.id>a.id order by b.id )<>cast(right(a.id,4) as int) 
    order by id)select top 1 left(id,16)+right('000'+ltrim(cast(right(id,4) as int)+1),4) 
    from tb a
    where (select top 1 cast(right(b.id,4) as int)-1 from tb b 
    where b.id>a.id order by b.id )<>cast(right(a.id,4) as int) 
    order by id
    elseselect left(max(id),16)+right('000'+ltrim(cast(right(max(id),4) as int)+1),4) from tb
      

  9.   

    加个flag,逻辑删除,不要真的删,到时再update
      

  10.   

    ID又不要钱的,怕什么浪费.
    查找最小未使用ID耗资源,那才是浪费.
      

  11.   

      做一个ID记录的表。
    如Id_table
     id 自动编号
     idKey 主键 (如:JDSK0001000100010006)
     idIsUsed 是否使用 在这个表里写放很多的ID.然后你现在的表每增加一次就在Id_table表里获取最小的一个id号(并且没用使用的),使用后idIsUsed改变状态。删除的时候把对应的idKey 的idIsUsed  改为 未使用。