mysql插入数据失败防止主键id自增的方法

当我们给数据表设置自增长主键id的时候,当插入数据失败时,id也会增长,打个比方,如果当前数据表最大主键id为39,插入一条新的数据失败后,紧接着再次插入数据成功,那么主键id为41,而并不是40,插入10条数据失败,紧接着再次插入数据成功,主键id为50,即虽然插入数据失败,但是主键id依然会保持自增,这是什么原因呢?
因为mysql的存储引擎是innoDB(大部分是),他的自增是缓存在内存字典中的,即先分配,再插入,也就是说即使插入失败了,但是内存已经被分配了,不会回收,让innoDB识别到当前最大id的方法是重新开启服务来更新AUTO_INCREMENT缓存,但这显然是不可取的,那么如何实现插入失败的时候主键id不会自增呢
Mysql主键如果在insert插入时有值,将不使用自增。也就是说插入数据的时候只要自己把id加上,那么就按照插入的数进行自增了,这个数值我们可以通过代码来控制:
 


$link = mysqli_connect('localhost','root','','test');
$sql = "select max(us_id) from user";
$result = mysqli_query($link,$sql);
$num= mysqli_fetch_array($result)[0] + 1;
echo $num;
$sql1 = "INSERT INTO `user` (`us_id`,`us_name`,`us_password`) VALUES ($num,'张三','zhangsan')";
mysqli_query($link,$sql1);
mysqli_close($link);


我们可以利用函数获取当前数据表的主键id的最大值,然后在最大值的基础上加1,赋值给id,那么就会按照赋值id去插入数据。
但是这种方法并不好,在处理高并发的数据时候很容易出错(待验证),而且多一层查询,必然会影响运行效率。

0 个评论

要回复文章请先登录注册