前言:
由于数据中的操作频率很大,估计没有多长时间,就会超过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语法不熟悉,还请各位大哥,高手帮帮忙看看.
由于数据中的操作频率很大,估计没有多长时间,就会超过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语法不熟悉,还请各位大哥,高手帮帮忙看看.
答:因为随机数产生的NewID可能表中已经存在,可能需要产生多次,才能获得一个表中没有的NewID.各位,伪代码有了,到底能不能做出这样的触发器代码呢??