前言:
由于数据中的操作频率很大,估计没有多长时间,就会超过2G (int类型的最大值),但是同时由于数据用完就会删除掉,所以其实数据库中的数据量并不大,总之如果用自增长的ID,会造成没多久就超过2G限制.(有朋友会说了,用bigint,没错,bigint是大,但是会造成对其它关联表的修改,暂时放弃这个想法先)要求:
所以,是不是可以使用触发器,当用户提交insert操作时,并不指定ID,只把其它字段赋好值,就insert过来.这时候,需要执行一个before insert的触发器,这个触发器的主要作用是取一个数据库中没有的ID,但这个ID是多少并不重要,只要返回给客户端就可以了.(又有同学要说了,为什么不在客户端软件自己来找呢,因为客户端有N多个,它们可能会同时找不存在的ID,从而有一定的概率最后还是相同的ID插了进来而造成插入失败,所以在服务器端找不同ID最为可靠)建议:
关于触发器如何找数据库中没有的ID的方法,我也想了几下子,觉得是不是用随机数的办法比较好,如:rand()*2000000000, 也就是产生一个int类型整个取值范围的ID,这样的话,和已存数据ID碰撞的可能性比较小.但还是有可能碰撞的(碰撞的概率和数据库中已存在的数据量有关).我们用个FOR 循环,如循环100次,只要取到成功地取到不同ID就退出循环.伪代码:
int NewID;
for count=0 to 100
  NewID = FLOOR(rand()*2000000000+1) --保证大于1(0为非法值)
  if (select count(*) from table_name where Table_ID=NewID)==0 --获取的新ID并不存在
     break --退出循环
  end if
continueif count<=100
  数据.ID = NEWID
  插入数据
else --超过了100,也就是说没有找到
  返回失败
end if///////////////////////////////////////////////
以上是小弟的拙见,如果有更好的办法,还请不吝赐教 :)
小弟实在对SQL语法不熟悉,还请各位大哥,高手帮帮忙看看.

解决方案 »

  1.   

    实际上生成唯一ID,用UUID、RAND可以,UUID要可靠一些为什么要用循环,直接查找ID是否在表中存在就可以了。
      

  2.   

    UUID和我前面说的bigint是同样的道理,因为这个ID是要和其它表关联的,因此程序修改很麻烦.更麻烦的是UUID产生的是一个char(36),并不是int.wwwwb:为什么要用循环,直接查找ID是否在表中存在就可以了。
    答:因为随机数产生的NewID可能表中已经存在,可能需要产生多次,才能获得一个表中没有的NewID.各位,伪代码有了,到底能不能做出这样的触发器代码呢??
      

  3.   

    可以考虑使用删除记录中的ID将删除记录的ID保存下来,下次再使用是否可行?