编辑这个问题几乎与2010年的this question重复,除了我没有使用交易,因此没有一个答案是有道理的.
编辑我不是问如何重置主键.我问为什么主键不是由连续数字自动递增.
我正在使用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
$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表有……
id, primary INT(10) unsigned auto-increment
uid, INT(10) unsigned
data, VARCHAR(24)
一切都按预期工作,但我没有看到id的值按照我预期的顺序递增(1,2,3等).它正在跳跃(1,20等),好像已创建线条,然后掉线,以形成最后一条线.谁能解释这种行为?需要我担心吗?
解决方法:
既然你澄清了,你的INSERT正在用uid创建重复的条目,这就是问题所在:
MysqL保留下一个自动增量值,并在尝试插入之前发出结束表锁定.然后插入失败并发生UPDATE部分.但是由于自动增量已经上移并且另一个进程可能已经选择了下一个数字,因此它不会再次减少.所以你得到一个洞.
当然,这一次只会产生一个“漏洞”,但由于你在密钥上这样做,它经常发生.并且由于硬编码的uid,它也发生在每个并发请求中.