【发布时间】:2018-02-09 05:11:45
【问题描述】:
在处理本地托管的项目时,我一直忙于管理 CSV 上传。其中一项任务要求我每天上传具有新条目或现有条目更新状态的数据。也有可能某些条目(存在于数据库中)没有更新状态。
问题陈述;
我创建了一个 CSV 上传功能,可将 CSV 文件上传到特定位置,并将信息导入指定的 TABLE 中。 我想知道在进行 CSV 上传时验证数据库记录的最佳方式是什么。
理想情况下它应该如下工作;
- 如果条目不存在(插入来自 CSV 文件的新条目基础数据)
- 如果条目存在并且状态与新上传的 CSV 文件相同(IGNORE & 什么也不做)
- 如果条目存在且状态与新上传的 CSV 文件中的条目不同(更新状态为 CSV 文件中提及的条目)
数据库/CSV文件结构
- tracking_id(自动递增)
- odanumber(通过 CSV 上传,可以有重复的条目)
- 空运单(通过 CSV 和 UNIQUE 上传)
- courierful(通过 CSV 上传,可能有重复条目)
- delstatus(通过 CSV 上传,主要更新内容)
- deliverydate(通过 CSV 上传并在每次交付时更新)
从上面可以看出,几乎每次(对于现有条目)上传新的 CSV 时,delstatus 都会更新,因此需要检查。
我假设我们可以选择“airwaybill”来检查它是否存在,并且 如果是,请检查 delstatus 是否与 CSV 文件相同或 更新。如果 'airwaybill' 不存在,则必须添加新记录 到数据库。因为这样可以避免我输入所有记录 不必要的数据库。或者可以以更好的方式完成(即 我还没有探索)。
现在发生了什么;
我可以上传完整的 CSV 文件,通过以下代码在数据库中创建新条目。
<?php
if(isset($_POST['csv']))
{
$sqlname= 'localhost';
$username= 'root';
$table= 'tracking';
$password= '';
$db='aatrack';
$file=$_POST['csv'];
$cons= mysqli_connect("$sqlname", "$username","$password","$db") or die(mysql_error());
$result1=mysqli_query($cons,"select count(*) count from $table");
$r1=mysqli_fetch_array($result1);
$count1=(int)$r1['count'];
mysqli_query($cons, '
LOAD DATA LOCAL INFILE "'.$file.'"
INTO TABLE '.$table.'
FIELDS TERMINATED by \',\'
LINES TERMINATED BY \'\n\'
IGNORE 1 LINES
')or die(mysql_error());
$result2=mysqli_query($cons,"select count(*) count from $table");
$r2=mysqli_fetch_array($result2);
$count2=(int)$r2['count'];
$count=$count2-$count1;
if($count>0)
{
header("location:success.php?id=$count");
}
}
?>
您能否帮助指导实现相同目标的最佳方法。我知道这可以通过首先将信息上传到 temp_table 并在 LIVE 表中更新条目之前进行比较来完成。
请提出实现结果的最佳方法。
感谢您阅读本文。
最好的问候,
阿米特·阿格尼霍特里
【问题讨论】:
-
假设每一行都有一个可用的唯一键/复合键,
INSERT ... ON DUPLICATE KEY UPDATE ...对你有用吗? dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html -
如果该条目在 csv 中不存在,您会: 1) 将其单独留在数据库中; 2)从数据库中删除它; 3) 更新数据库中的状态?
-
@WeeZel 如果 CSV 中不存在该条目,我会将其单独留在数据库中。谢谢!
-
@Weezel 你对我有同样的建议吗?
-
@AmitAgnihotri 我(仍然)确定 LOAD INFILE 是您的最佳解决方案。我读过,否则使用其他方法导入需要很长时间。现在, LOAD INFILE 在进行记录更新时的行为是:删除旧记录并插入具有更新值的新记录。这意味着每次设置一个新的 tracking_id 值,如果它不是从 csv 文件中读取的。那么,我的第一个问题:您是否还从 csv 文件中导入“tracking_id”值?
标签: php mysql csv file-upload load-data-infile