为啥我使用xmlhttprequest抓取数据时主键跳转量大?

Posted

技术标签:

【中文标题】为啥我使用xmlhttprequest抓取数据时主键跳转量大?【英文标题】:Why does my primary key jump large amounts when I use xmlhttprequest to capture data?为什么我使用xmlhttprequest抓取数据时主键跳转量大? 【发布时间】:2017-12-20 16:27:36 【问题描述】:

编辑这个问题几乎与 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();elsez=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 表有...

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

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

【问题讨论】:

我看不到您在 PHP 脚本中回显任何内容。发帖到/scripts/save_data.php 会得到什么? 可能来自INSERT INTO ... ON DUPLICATE KEY UPDATE ... 似乎为插入保留了一个密钥,然后在更新时将其丢弃。顺便提一句。我不会在每个按键事件中写入数据库。 Resetting the primary key to 1 after deleting all the data的可能重复 您的查询中没有唯一键。更新部分永远不会发生。 ID 每次都会自动递增。 @colburton 除非uid 是问题中未提及的唯一键? 【参考方案1】:

由于您已澄清,您的 INSERT 正在使用 uid 创建重复条目,这就是问题所在:

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

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

【讨论】:

次要问题:我是否需要主键,因为我有明确定义唯一性的唯一键?看起来我永远不会真正填满 INT(10) 初级,但是,嘿,这个网站可能已经运行了 50 年......还是我应该忽略整个事情? 您不应包含不需要的键(或列)(性能)。如果您可以选择另一列(也可以是列的组合),您应该这样做。 id 通常用作外键,但您也可能不需要它。但是,如果您使用INNODB,它将始终创建一个自动递增索引,并且如果您不自己添加索引,则不会显示给您。

以上是关于为啥我使用xmlhttprequest抓取数据时主键跳转量大?的主要内容,如果未能解决你的问题,请参考以下文章

为啥叫 XMLHttpRequest?

为啥我不能使用 XMLHttpRequest 从本地网络获取 JSON 文件? [复制]

为啥我不能使用 XMLHttpRequest 从本地网络获取 JSON 文件? [复制]

为啥 XMLHttpRequest 上传在 Firefox 中没有正确失败?

为啥 XMLHttpRequest 没有回复?

为啥在xmlHttpRequest的open方法中使用参数true,却还是否异步啊?