非连续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位以上?),不完美发生的概率非常非常非常非常非常非常非常非常小.
来源:[php mysql实现非连续不重复ID](http://yeshouyou.com/2016/03/10/php-mysql%E5%AE%9E%E7%8E%B0%E9%9D%9E%E8%BF%9E%E7%BB%AD%E4%B8%8D%E9%87%8D%E5%A4%8Did/)
本条目发布于[2016年7月15日](https://c4ys.com/archives/631 "09:20")。属于[Database](PHP(https://c4ys.com/archives/category/php)分类,被贴了 [mysql](https://c4ys.com/archives/tag/mysql) 标签。