非连续ID有很多用处.最大的一个用处就是作为订单id,用户id之类的不想让别人遍历(直接通过请求里面传id值来爬你的数据),以及不想让别人看出来你有多少数据量(如果是连续id,应用有多少订单,一目了然)的id.
mysql的实现方法
添加一个触发器,每次插入的时候通过取当前最大的id然后加一个随机数得到新的id.
CREATE TRIGGER `rand_increase` BEFORE INSERT ON `users` FOR EACH ROW SET NEW.id=(SELECT max(id) FROM users)+FLOOR(RAND()*500)
php的实现方法
生成一个ID,到数据库里面查看ID是否存在,如果存在,再生成一个.
class model
{
public function generateRandomId($length=15) {
$random = "";
for ($i = 0; $i < $length; $i++) {
$random .= mt_rand(0, 9);
}
return $random;
}
public function beforeInsert() {
do{
$inserId=$this->generateRandomId(10);
}while(!$this->selectById($inserId));
$this->insertId=$inserId;
}
}
理论上,在超高并发条件下,这两种方法都不是完美的解决办法,但是实际上只要你的id不是太短(比如15位以上?),不完美发生的概率非常非常非常非常非常非常非常非常小.