我一直在尝试使用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()表示已跳过所有行。知道为什么它没有正确显示吗?
希望有足够的信息。谢谢!
编辑:
在过去的几天里,我有点忙于处理这个问题,但我已经决定虽然它没有具体回答我的问题,但是德鲁斯的回答是暂时的。表首先似乎最有意义所以我决定采用它。
答案 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