项目中对接一个单点登陆的回调api,需要判断用户是否在库,不在库新增用户,在库更新登陆次数,大概代码如下:
<?php $isExist = true; if ($isExist) { insert([ 'id' => 392223903, 'username' => 'gaojiufeng', 'password' => '123456', 'login' => 1, //登陆次数 ]); } else { update([ 'login' => '+1' ]); }
上面的代码在高并发下会出现问题,主键会重复插入报错。于是我们使用MySQL ON DUPLICATE KEY UPDATE语句,不存在直接新增,存在就更新,代码如下:
INSERT INTO member ( id, username, PASSWORD, login ) VALUES ( 392223903, 'gaojiufeng', '123456', 1 ) ON DUPLICATE KEY UPDATE login = login + 1;
其实在thinkphp自带了这种方案,但是使用的REPLACE INTO语句,REPLACE INTO语句发现主键重复会删除原来的数据,再次新增一条。虽然能够达到我的要求,但是我并不想更新全部字段,目前看来ON DUPLICATE KEY UPDATE语句性能更高。