为什么我用xmlhttprequest抓取数据时,主键跳动很大?

Why does my primary key jump large amounts when I use xmlhttprequest to capture data?

编辑 这个问题几乎与 2010 年的 this question 重复,只是我没有使用交易,所以 none 的答案感觉。

EDIT 我不是在问如何重置主键。我在问为什么主键不是按连续数字自动递增的。


我正在使用 xmlhttprequest 来捕获您键入的信息并将其存储在我的 Mysql 数据库中。

HTML

<input type="text" name="example" onKeyUp="saveData(this)">

JAVASCRIPT

function saveData(a){
    var z;
    var d=new FormData();
    d.append('data',a.value);
    if(window.XMLHttpRequest){z=new XMLHttpRequest();}else{z=new ActiveXObject("Microsoft.XMLHTTP");}
    z.onreadystatechange=function(){if(z.readyState==4&&z.status==200){if(z.responseText=='false'){alert(z.responseText);}}}
    z.open("POST", '/scripts/save_data.php');
    z.send(d);
}

PHP 出于测试目的,我对 uid 用户 ID 进行了硬编码。

<?php
$stmt=$pdo->prepare("INSERT INTO `user_data` (`uid`, `data`) VALUES (:myuid,:mydata) ON DUPLICATE KEY UPDATE `data`=values(`data`)");
$stmt->bindValue('myuid',1,PDO::PARAM_INT);
$stmt->bindParam('mydata',$_POST['data'],PDO::PARAM_STR);
$stmt->execute();

我的 MySQL table 有...

id, primary INT(10) unsigned auto-increment
uid, INT(10) unsigned
data, VARCHAR(24)

一切都按预期工作,但我没有看到 id 的值按​​我预期的顺序递增(1、2、3 等)。它在跳跃(1、20 等),就好像已经创建了线条,然后放下,形成了最后一行。谁能解释这种行为?需要我担心吗?

既然你澄清了,你的 INSERT 正在创建与 uid 的重复条目,这就是问题所在:

MySQL 保留下一个自动增量值并在尝试插入之前发出结束 table 锁。然后插入失败, UPDATE 部分发生。但是由于自动增量已经被向上移动并且另一个进程可能已经选择了下一个数字,所以它不会再次减少。所以你得到一个洞。

当然,这一次只会创建一个 "hole",但是由于您是在 keyup 上执行此操作,所以它经常发生。并且由于硬编码 uid 它也会发生在每个并发请求中。