2

我有一个 PHP 文件,它使用 LOAD DATA INFILE sql 函数将 CSV 文件中的数据插入 MYSQL DB。

如果 CSV 数据是重复的,则由于 DB 表索引规则(唯一),它不会被插入。

$sql = "LOAD DATA LOW_PRIORITY LOCAL INFILE 
       '" . $makes_file . "' IGNORE 
       INTO TABLE make 
       FIELDS TERMINATED BY ',' 
       LINES TERMINATED BY '\n' (make, img_url)";

$link->query($sql) or die(mysqli_error($link));

由于某种原因,此过程中表的自动增量不正确。

所以我用下面的代码来纠正这个问题。

$get_max = $link->query("SELECT max(id) as max FROM `make` LIMIT 1");
while ($r = $get_max->fetch_assoc()) {
    $link->query("ALTER TABLE  `make` AUTO_INCREMENT = " . ($r['max'] + 1)) or 
    die(mysqli_error($link));
}

所以如果有人知道:

  1. 为什么 LOAD DATA sql 中的 Auto Increment 不正确或
  2. 如果有一种“更漂亮”的方式将自动增量设置为 max(id) +1

谢谢

4

2 回答 2

4

对于 MyISAM 表,您只需将 AUTO_INCREMENT 设置为 0,MySQL 将使用当前最大值加一。

$link->query('ALTER TABLE make AUTO_INCREMENT = 0');

从文档

您不能将计数器重置为小于或等于任何已使用的值。对于 MyISAM,如果该值小于或等于 AUTO_INCREMENT 列中当前的最大值,则将该值重置为当前最大值加一。

于 2015-04-23T04:20:03.533 回答
1

这个答案是关于 将自动增量设置为 max(id) +1 的一种更漂亮的方法,您只能使用一个 Query 来做到这一点:

$link->query("ALTER TABLE  `make` AUTO_INCREMENT = ( SELECT max(id)+1 FROM `make` LIMIT 1 )" );

但是如果AUTO_INCREMENTunique,您的第一个解决方案应该可以工作,请检查您的数据库 sheme

于 2013-09-05T20:56:53.560 回答