thinkphp5 模型多次save操作,会产生重复的主键ID

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/li_haijiang/article/details/81639589

在thinkphp5.0.2版本下使用,如果用模型多次执行save操作,会提示产生的主键ID重复。代码如下

 $FbPostImageModel = new FbPostImage();
 for ($i=0; $i < 10; $i++) { 
      $data['object_id'] = rand(0, 10000);
     $data['picture'] = "test";
     $data['images'] = "test";
     $data['link'] = "abc";
     $data['caption'] = "";
     $FbPostImageModel->isUpdate(false)->save($data);
 }

异常提示:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '17' for key 'PRIMARY'
            // 调试结束
            $this->debug(false);

            $this->numRows = $this->PDOStatement->rowCount();
            return $this->numRows;
        } catch (\PDOException $e) {
            if ($this->config['break_reconnect'] && $this->isBreak($e)) {
                return $this->close()->execute($sql, $bind);
            }
            throw new PDOException($e, $this->config, $this->getLastsql());
        }
    }

    /**
     * 根据参数绑定组装最终的SQL语句 便于调试
     * @access public
     * @param string    $sql 带参数绑定的sql语句
     * @param array     $bind 参数绑定列表
     * @return string
Call Stack
in Connection.php line 457
at Connection->execute('INSERT INTO `fb_post...', ['__data__object_id' => [731, 2], '__data__picture' => ['test', 2], '__data__images' => ['"test"', 2], ...]) in Query.php line 239
at Query->execute('INSERT INTO `fb_post...', ['__data__object_id' => [731, 2], '__data__picture' => ['test', 2], '__data__images' => ['"test"', 2], ...]) in Query.php line 2062
at Query->insert(['object_id' => 731, 'picture' => 'test', 'images' => '"test"', ...]) in Model.php line 934
at Model->save(['object_id' => 731, 'picture' => 'test', 'images' => 'test', ...]) in Index.php line 40
at Index->testMultiInsert()
at ReflectionMethod->invokeArgs(object(Index), []) in App.php line 224
at App::invokeMethod([object(Index), 'testmultiinsert'], []) in App.php line 389
at App::module(['Index', 'index', 'testMultiInsert'], ['app_namespace' => 'app', 'app_debug' => true, 'app_trace' => false, ...], null) in App.php line 130
at App::run() in start.php line 18
at require('/home/web/facebook_p...') in index.php line 20

生成的sql是:

INSERT INTO `fb_post_image` (`object_id` , `picture` , `images` , `link` , `caption` , `update_time`) VALUES ('8822' , 'test' , '\"test\"' , 'abc' , '' , '2017-03-09 14:47:40')

这里的17是自增主键ID。为了避免这个问题,需要将新增代码改成

$FbPostImageModel->isUpdate(false)->data($data, true)->save();

生成的sql是

INSERT INTO `fb_post_image` (`object_id` , `picture` , `images` , `link` , `caption` , `update_time`) VALUES ('7774' , 'test' , '\"test\"' , 'abc' , '' , '2017-03-09 14:48:49')

这是thinkphp的bug。

猜你喜欢

转载自blog.csdn.net/li_haijiang/article/details/81639589