我在这里遇到了一个奇怪的问题。我有一个脚本,基本上使用php中的fgetcsv()
将CSV文件导入数据库。完全没有问题,我可以使用MySQL语法ON DUPLICATE KEY UPDATE
更新旧条目(我绝不是MySQL专家,因此我在这里问)。
以下是代码的一部分:
$handle = fopen($file,"r");
fgetcsv($handle, 1000, ",");//skip first row since they are headers
while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop
{
//read array values into vars
$item1 = $fileop[0];
$item2 = $fileop[1];
$key = $fileop[2];
// and a couple more
// now INSERT / UPDATE data in MySQL table
$sql = mysql_query("INSERT INTO table (item1,item2,key)
VALUES ('$item1','$item2','$key')
ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'");
}
一切正常。我坚持的是,某些条目可能已从实际CSV中删除(因为密钥可能不再存在)。我想要做的是删除MySQL表中不再存在的条目。
如果$key
从CSV中消失,则表示删除数据库表中的该行。我想在MySQL表上运行Insert / Update查询之前我会这样做吗?
我很感激任何帮助。
答案 0 :(得分:0)
只需记下您的密钥。
在您的while中将每个$key
保存在一个数组中,最后运行一个查询
DELETE FROM tabel WHERE key NOT IN (listofcommaseparatedkeysgoeshere)
$arrayThatYouNeedToTest = array();
$handle = fopen($file,"r");
fgetcsv($handle, 1000, ",");//skip first row since they are headers
while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop
{
//read array values into vars
$item1 = $fileop[0];
$item2 = $fileop[1];
$key = $fileop[2];
// and a couple more
// now INSERT / UPDATE data in MySQL table
$sql = mysql_query("INSERT INTO table (item1,item2,key)
VALUES ('$item1','$item2','$key')
ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'");
$arrayThatYouNeedToTest[] = $key;
}
$stringThatYouNeedToInspect = implode(",",$arrayThatYouNeedToTest);
$queryYouREALLYneedToCheckFirst = "DELETE FROM tabel WHERE key NOT IN (".$stringThatYouNeedToInspect.")";
//$result = mysql_query($queryYouREALLYneedToCheckFirst);
答案 1 :(得分:0)
我通过联盟网站做了类似的事情 - 只有不到500,000个产品。
在您的数据库中,只需添加另一个名为“update_flag”的列或类似的列。将默认值设置为0.在CSV文件中添加项目时,请将update_flag设置为“1”。在“重复声明”中,将字段设置为“2”。我还去了另外两个字段:“date_added”和“date_updated”。
导入完成后,您可以计算旧项目(要删除),新添加的项目以及已更新的项目。然后,您可以从表中删除update_flag = 0
我希望这会有所帮助。