cakephp可以防止重复

时间:2015-01-06 17:43:27

标签: mysql cakephp duplicates

我有一个学生用ID字段作为主键,但没有自动编号 插入新记录时,我必须调用getNextID()函数来获取要插入的下一个id

function getNextID(){
   /*I am type code inside function now not copied from actual code but consider it will return max_1*/
   $max_id = $this->Student->find('list',array(
          'fields'=>array('id'),
          'order'=>array('id desc'),
          'limit'=>1
          ));
   $next_id = $max_id + 1;
}

我面临的问题是 当多个用户同时调用此函数时,两个用户将获得相同的$ next_id并且它将被复制 我想知道如何防止重复 注意:我无法将其设为自动编号

3 个答案:

答案 0 :(得分:2)

  

我有一个带ID字段的学生,这是主键,但没有   自动编号

为什么呢?这根本没有多大意义。

使用UUID。产生重复的probability绰绰有余。

$id = String::uuid();

答案 1 :(得分:0)

我已经通过将静态变量$locked定义为

来解决了我的问题
private static $locked;

并在egtNextID()函数中稍作修改

function getNextID(){
    self::$locked = true;
    $max_id = $this->Student->find('list',array(
      'fields'=>array('id'),
      'order'=>array('id desc'),
      'limit'=>1
      ));
    $next_id = $max_id + 1;
    self::$locked = false;
    return $next_id;
}

并在将getNextID()调用为

之前添加了几行
 while(self::$locked != false){
     sleep(1);
 }

这解决了我的问题

答案 2 :(得分:0)

使用下面提到的函数获取唯一ID: -

public function createId( $intOnly = true ) {
    $fixed = 1390000000;
    $t = explode( " ", microtime() );
    $uid = $t[1] - $fixed;
    return ( $intOnly ) ? $uid : uniqid();
}

默认为整数,如果传递参数false,则会给出字符串。

它将始终返回唯一ID。