学生表里有一个考试号,每个学生的考试号都是程序生成的不重复的8位随机数。
现在保证插入学生表的数据,考试号和数据库中已经存在的学生的考试号不重复的算法是这样的。先生成一个8位的随机数,然后于查找学生表是否存在这个考试号,如果存在就重新生成一个随机数,再次比较,直到满足条件。现在的学生表数据量很大。超过百万,所以每次生成随机数比对的操作都特别的慢。建了索引的情况下,有时插入一条新的学生数据还得10秒。请问这个问题应该如何解决,或者有更好的处理方式,每次插入的学生号不能有顺序,不能用自动增长列。

解决方案 »

  1.   

    学生考试号用计算列+NEWID()算出来,再设个不能重复约束就行了,NEWID()百万数据想重复也不是那么容易的
      

  2.   

    不要被“每次插入的学生号不能有顺序”框住,那只是指SELECT时不能按插入的顺序显示
      

  3.   

    用newid()生成一个数,然后再生成一个随机数(可显示字符)代替其中的每一位就行了。
      

  4.   


    觉得这句说得比较有道理,只要选择是不按顺序就可以了。
    不知道这样设计的初衷是什么, 是不是只是为了把学生号打乱呀?一次把几百万的学生打乱,不知道怎么会有这个需求?通常在实际上,学生是会分区,只要在一个分区内的打乱就可以了。几千的数据应该够了。也就是说,可不可以考虑,把几百万的数据分成若干组,然后在每一组内设置不可重复号?
    这样可以解决计算量过大的问题。另外不知道楼主使用的是什么数据库,如果是sql 2000,一次对付几百万条数据是有点吃力的。
      

  5.   

    设计很不合理啊,其实就是蒙出来的一个学生号。学生号不能有顺序,但可以有规律的。比如通过一串无意义的数据+自增列数,算MD5 HASH,然后去MD5 HASH中的某几位数。大概的提供一个思路。