自动递增低于总行数

Auto increment is lower than total rows

我创建了一个 php 脚本,它从 1 table 中获取值并将它们插入另一个。

这执行得非常快(每秒 1000 行)。

一切顺利。 table 中没有重复项,我认为其他 table 中的所有值都已插入。

但是有一些奇怪的事情引起了我的注意:

table 中共有 903388 行,但启用自动递增的最高 ID 是 898582。 这是 4806.

的差异

另一个 table 的项目数量几乎与 ID 相同,但由于原始 table 总是获得新值,所以总是有一点偏差。

由于数据库太大,无法生成 MRE

所以现在我的问题是:

自增值如何小于总行数?

原始tables ID的数据类型:

bigint(20)

图像的数据类型table ID:

int(11)

显示创建 table 个图像;

CREATE TABLE `IMAGES` (
  `ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `SRC` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci DEFAULT NULL COMMENT 'Pad naar afbeelding',
  `VERWIJDERD` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0=image is online, 1=image is verwijderd',
  `DATUM` datetime NOT NULL DEFAULT current_timestamp() COMMENT 'Datum van upload',
  `IP` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci DEFAULT NULL COMMENT 'ip van uploader',
  `SITE` tinyint(1) DEFAULT NULL COMMENT 'site waar image is geupload',
  `OID` int(11) DEFAULT NULL COMMENT 'occasion id',
  `POSITIE` int(11) NOT NULL DEFAULT 0 COMMENT 'sorteer id',
  `TYPE` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0=normaal 1=schade',
  PRIMARY KEY (`ID`),
  KEY `OID` (`OID`)
) ENGINE=InnoDB AUTO_INCREMENT=898583 DEFAULT CHARSET=latin1

我的 PHP 脚本填充 table:

<form action="" method="post">
  <label for="fname">Rijen:</label><br/>
  offset<input type="number" name="offset"><br/>
  amount<input type="number" name="amount"><br/>
  <button type="submit" name="submit">Go</button>

</form><br/>
<?php
    $per_insert = 100;

    if(isset($_POST['submit'])){
        echo "Offset: ".$_POST['offset']."<br/>";
        echo "Limit: ".$_POST['amount']."<br/>";
        $msc = microtime(true);
        $count = (is_numeric($_POST['offset']) ? (int)$_POST['offset'] : 0);
        $amount = (is_numeric($_POST['amount']) ? (int)$_POST['amount'] : 0);
        $qcount = 0;
        $filter_array =  array('images/occ/', null, '');
        for ($i = $count+$per_insert; $i <= $amount; $i+=$per_insert){
            $valuesq = array();
            $olddataq = $mysqli->query("SELECT `ID`,SITE,DATUM,IP,`IMG_1`,`IMG_2`,`IMG_3`,`IMG_4`,`IMG_5`,`IMG_6`,`IMG_7`,`IMG_8`,`IMG_9`,`IMG_10`,`IMG_11`,`IMG_12`,`IMG_13`,`IMG_14`,`IMG_15`,`IMG_16`,`IMG_17`,`IMG_18`,`IMG_19`,`IMG_20`,`IMGS_1`,`IMGS_2`,`IMGS_3`,`IMGS_4`,`IMGS_5`,`IMGS_6`,`IMGS_7`,`IMGS_8`,`IMGS_9`,`IMGS_10`,`IMGS_11`,`IMGS_12`,`IMGS_13`,`IMGS_14`,`IMGS_15`,`IMGS_16`,`IMGS_17`,`IMGS_18`,`IMGS_19`,`IMGS_20` FROM `OCCASIONS` LIMIT ".$per_insert." OFFSET ".$count.";");
            $qcount++;
            $schade = $normaal = 0;
            while($olddata = $olddataq->fetch_assoc()){
                $olddata = array_diff($olddata, $filter_array);
                $id = $olddata['ID'];
                $datum = $olddata['DATUM'];
                $ip = $olddata['IP'];
                $site = $olddata['SITE'];
                unset($olddata['DATUM']);
                unset($olddata['ID']);
                unset($olddata['IP']);
                unset($olddata['SITE']);
                while ($data = current($olddata)) {
                    $key = explode('_',key($olddata));
                    if($key[0] == 'IMG'){
                        //normale image
                        $datacheck = check_fotodata($data, $id, $key[1], 0);
                        if($datacheck === false){
                            $valuesq[] = "('".$data."','".$datum."','".$ip."',".$site.",".$id.", ".$key[1].", 0,0)";
                        }else{
                            $valuesq[] = $datacheck;
                        }
                    }else{
                        //schade image
                        $datacheck = check_fotodata($data, $id, $key[1], 1);
                        if($datacheck === false){
                            $valuesq[] = "('".$data."','".$datum."','".$ip."',".$site.",".$id.", ".$key[1].", 1,0)";
                        }else{
                            $valuesq[] = $datacheck;
                        }
                    }
                    next($olddata);
                }
            }
            $count += $per_insert;
            //var_dump($valuesq);
            $mysqli->query("INSERT INTO IMAGES (SRC, DATUM, IP, SITE, OID, POSITIE, TYPE, VERWIJDERD) VALUES ". implode(",", $valuesq));
            $qcount++;    
        }
        $msc = microtime(true)-$msc;
        echo "buildtime: <br/>";
        echo $msc . ' s<br/>'; // in seconds
        echo ($msc * 1000) . ' ms<br/>'; // in millseconds
        echo $qcount . "<br/>";
        $msc = microtime(true);
    }
    
    function check_fotodata($image, $oid, $pos, $type){
        global $qcount, $mysqli;
        $checkdataq = $mysqli->query("SELECT * FROM FOTODATA WHERE KID = ". $oid ." AND IMG = '". $image ."'");
        $qcount++;
        if($checkdataq->num_rows > 0){
            $checkdata = $checkdataq->fetch_assoc();
            if($checkdata['INFO'] == 'Verwijderd'){
                $del = 1;
            }else{
                $del = 0;
            }
            return "('".$checkdata['IMG']."', '".$checkdata['DATUM']."', '".$checkdata['IP']."', '".$checkdata['SITE']."', '".$checkdata['KID']."',".$pos.",".$type.",".$del.")";
        }else{
            return false;
        }
    }

请先通过以下查询检查 table 的计数,然后再进行比较。如果在 MySQL.

中使用 auto_increment_offset 1 和 auto_increment_increment 1,table 的计数和最大 ID 应该相等

select count(*) from IMAGES;

请评论您的发现。