另建一张表,(单号 char(5), 有无 bit), 然后
create unique clustered index idx_name on table(有无,单号)以保证查询速度

解决方案 »

  1.   

    新建的表里,存放
    0001, 1
    0002, 1
    0003, 1
    ...   ...
    9999, 1
    然后,每用掉一个,把1改成0.不过要把SELECT和UPDATE放在一个TRANSACTION里.
      

  2.   

    同意andytangty(清流刀) 的方法
      

  3.   

    有时候还是需要真正删除的,没用的东西占着数据库,也是会对性能有影响。所以有时删除也是在所难免。 andytangty(清流刀)说的方法是对的,应该是在保存时再去取单号。但是要避免几个人同时抢一个号的情况,这也是比较麻烦的。另外还要提供自动填补断号的功能,也只能是在保存时再进行操作。所以保存的程序是比较不好做的了。要允许在保存时先试着填补断号,没有断号时按最大号码+1来保存,保存不成功时允许进行几次尝试,但不要无限制地等待。
      

  4.   

    关于问题一
    --表名TABLE1,自动增加字段ID  CHAR(10),避免空号
    SELECT RIGHT('0000000000' + LTRIM(STR((ISNULL(MIN(ID),'0'))+1)),10)
      FROM TABLE1
     WHERE RIGHT('0000000000' + LTRIM(STR((ISNULL(ID,'0'))+1)),10) NOT IN (
    SELECT B.ID 
                                                                      FROM TABLE1 B
                                                                    )
      

  5.   

    其实删除数据的做法我以前也用的,不过后来在客户使用(特别是试运行阶段)的过程中,经常需要查找不同胞表数据的差异,比如月结存树和当月出入库等的比较时,这些数据可以帮你找出原因的,特别是程序错误导致数据处理不一致的时侯,如果这些数据备删掉了,你可能要花上n倍的时间来找这些bug(估计任何程序都有的);而且需要删除的数据在实际中是不会太多的,这里就是一个平衡的问题,需要大家自己来把握了。
    几个人抢号的问题你可以用Update将该表锁住,然后取出数据,再将锁放开,有很小的速度影响,不过应该没问题。
      

  6.   

    问题二
    首先你必须打开事务,从调用存储过程,一直到前台查询临时表数据,都必须在同一个事务里,否则一定会出问题。以下我说的都是指就算在同一个事务里也会出现的其他问题。
    A,B放入临时表中的数据,如果和临时表中本身的数据相关,则临时表放入后,数据可能是错误的。因为先查询出数据直到放临时表之前,临时表都没有被上锁,只有当临时表中的数据改变后临时表才能上锁,阻断另一个事务。
    A,B同时调用时,先操作临时表的事务,会锁定临时表,另一个事务被阻断,当先操作临时表的事务COMMIT或ROLLBACK后,另一个事务才能开始操作临时表。所以如果第一个事务一直不提交或回滚,则第二个事物就一直被阻塞,其他人就一直不能看到数据。从实现的效率上说,可以说是最底的。
    我到建议你为不同的事务建立不同的临时表,使用后就丢弃,这样自己使用自己的临时表就可以避免阻塞,数据也不会别别的事务篡改。
      

  7.   

    问题二
    首先你必须打开事务,从调用存储过程,一直到前台查询临时表数据,都必须在同一个事务里,否则一定会出问题。以下我说的都是指就算在同一个事务里也会出现的其他问题。
    A,B放入临时表中的数据,如果和临时表中本身的数据相关,则临时表放入后,数据可能是错误的。因为先查询出数据直到放临时表之前,临时表都没有被上锁,只有当临时表中的数据改变后临时表才能上锁,阻断另一个事务。
    A,B同时调用时,先操作临时表的事务,会锁定临时表,另一个事务被阻断,当先操作临时表的事务COMMIT或ROLLBACK后,另一个事务才能开始操作临时表。所以如果第一个事务一直不提交或回滚,则第二个事物就一直被阻塞,其他人就一直不能看到数据。从实现的效率上说,可以说是最底的。
    我到建议你为不同的事务建立不同的临时表,使用后就丢弃,这样自己使用自己的临时表就可以避免阻塞,数据也不会别别的事务篡改。
      

  8.   

    同意andytangty的说法。
    另外楼主说的问题,实现起来确实有一定的难度,
      

  9.   

    至于在第一个问题中,update前用select取出可用的编号(包括最小号或者当前最大号,至于怎样取,前面已经讲清楚了),然后在update时增加一个条件,即:
    where code=:curcode  //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的
      

  10.   

    至于在第一个问题中,update前用select取出可用的编号(包括最小号或者当前最大号,至于怎样取,前面已经讲清楚了),然后在update时增加一个条件,即:
    where code=:curcode  //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的
      

  11.   

    至于在第一个问题中,update前用select取出可用的编号(包括最小号或者当前最大号,至于怎样取,前面已经讲清楚了),然后在update回时增加一个条件,即:
    where code=:curcode  //code是可用号码的字段名,curcode是刚刚读取的可用号码。然后在update后检测语句执行的成功与否,成功则提交事物,如果失败,则说明另外一个人已经比你先一步进行了保存,那么程序则可以提请用户再保存一次嘛,第二次、第三次……,除非这个用户的运气太差了,否则应该成功提交事物的