PHP MYSQL将AUTO INCREMENT设置为MAX + 1

时间:2013-09-05 20:44:17

标签: php mysql sql csv auto-increment

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

如果CSV数据是重复的,则由于数据库表索引规则(唯一)而未插入CSV数据。

$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的自动增量不正确 或
  2. 如果有一种“更漂亮”的方式将自动增量设置为max(id)+1
  3. 由于

2 个答案:

答案 0 :(得分:2)

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

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

From the docs

  

您无法将计数器重置为小于或等于任何值的值   已经被使用过。对于MyISAM,如果值小于或等于   到当前在AUTO_INCREMENT列中的最大值,该值   重置为当前最大值加1。

答案 1 :(得分:1)

这个答案是关于将自动增量设置为max(id)+1 的更漂亮的方法,您只能使用一个查询来执行此操作:

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

但如果AUTO_INCREMENTunique,那么您的第一个解决方案应该有效,请检查您的数据库设置