我有一个产品的CSV文件,如果存在则需要添加或更新,即使已从列表中删除,也会保留旧文件。
我有一个这样的循环:
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
哪个工作正常,从中我分配了几个这样的变量:
$price = htmlspecialchars(mysql_real_escape_string($data[2]), ENT_QUOTES, 'utf-8' );
在我设置了我需要的4个变量之后,我会像这样查询MySQL:
mysql_query("SELECT * FROM products WHERE productid = '$prodid' AND supplier = 'SUPPLIER1'")
如果结果为1或更多我们只是更新它
mysql_query("UPDATE tuotteet SET
supplier = 'SUPPLIER1',
product = '$product',
prodid = '$prodid',
ean = '$ean',
price = '$price' WHERE prodid= '$prodid' AND supplier = 'SUPPLIER1'") or die(mysql_error());
如果未从数据库中找到产品,我们会再次进行INSERT查询。问题是,这是一种非常缓慢的方法,需要花费很多分钟才能完成10000条产品线。
与此有什么关系?
答案 0 :(得分:1)
在开始这个过程之前,我会在数据库中查询数据库中的所有product_id,然后我会将它们存储在字典中。
然后,开始处理csv文件。
对于每条记录,只要询问字典是否有当前product_id的密钥。
这样做可以避免为csv中的每条记录转到数据库。
答案 1 :(得分:0)
我有类似的问题。最好的解决方案是构建单个查询。这是Python中的代码:
# data to updload in a dictionary {id, new_value}
dict = {2:1001,4:251}
ids = []
sql = "UPDATE tabla1 SET value = CASE id "
for key in dict:
sql = sql + 'WHEN '+str(key)+' THEN '+str(dict[key])+ '\n\t'
ids.append(key)
ids_string = ', '.join(map(str, ids))
sql = sql + "END WHERE id IN ("+ids_string+")"
print sql
答案 2 :(得分:0)
它会更快,更高效,并且需要更少的代码才能使用LOAD DATA:
LOAD DATA LOCAL INFILE 'myinput.csv'
REPLACE INTO TABLE tuotteet
您只需要确保在列(prodid, supplier)
上定义了PRIMARY KEY或UNIQUE KEY。 LOAD DATA将使用它来判断该行是否已存在且需要更新,或者该行是否不存在且需要作为新行插入。
然后你不需要使用fgetcsv(),你不需要进行任何转义,你不需要SELECT或UPDATE或INSERT,它应该运行大约10倍。