LOAD DATA INFILE - 显示导入的行数给出错误的值

时间:2016-07-07 14:47:18

标签: php mysql csv

我一直在尝试使用LOAD DATA INFILE将csv文件导入mysql数据库。

所有内容都或多或少地正常工作,但是当我使用mysqli_info()或mysqli_affected_rows()时,它们都显示没有为查询导入任何行。即使我看到行正确导入。

我正在尝试做的简化版本(我实际导入的列数较少):

$server = 'localhost';
$username = 'root';
$password = 'password123';
$database = 'database_name';

$connect = new mysqli($server, $username, $password, $database);

$files = scandir('imports/');

foreach($files as $file) {
   $import = 
        "LOAD DATA INFILE 'imports/$file'
        IGNORE INTO TABLE table_name
        FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
        LINES TERMINATED BY '\n'
        IGNORE 1 LINES
        (@id, @name, @address, @product)
        set id=@id, name=@name, address=@address, product=@product";

    if(! $connect->query($import)) {
        echo 'Failed';
    }

    $connect->query($import);

    echo mysqli_affected_rows($connect);
}

mysqli_affected_rows()返回0,而mysqli_info()表示已跳过所有行。知道为什么它没有正确显示吗?

希望有足够的信息。谢谢!

编辑:

在过去的几天里,我有点忙于处理这个问题,但我已经决定虽然它没有具体回答我的问题,但是德鲁斯的回答是暂时的。表首先似乎最有意义所以我决定采用它。

1 个答案:

答案 0 :(得分:3)

进一步澄清我的评论:I would not be relying on $connect->affected_rows as ever a Rosetta stone for info. It is broken half the time.

这是一个建议。将LOAD DATA INFILE执行到工作表中,而不是最终所需的表。执行完成后,您已成功逃脱了该功能的限制,可以享受Insert on Duplicate Key Update(IODKU)的成果。

对于后者,当我想知道计数时,我从控制表中得到一个指定的批号。如果您需要帮助,请告诉我。

但我现在回过头来处理工作台中的数据,手头有批号。然后,我将IODKU从工作台执行到最终表格,批次编号随后进入最终表中的一列(是的,我可以调整模式来执行此操作,也许您不能)。为了解决对现有表的任何模式更改,并查找案例或允许具有多个批次ID的行已经命中它,可以使用具有id的简单关联表。如果愿意,可以使用交叉表。

如果并发是一个问题(多个用户可能同时执行此操作),则采用锁定策略(理想情况下为INNODB行级锁定)。如果使用,请快速。

然后我从最终表格(或交叉表格)中取出我的计数,其中批次ID =我手中的批号。

另见Jan。的这个answer