MySQL更新行。需要更新许多独特的行

时间:2011-07-09 19:50:15

标签: mysql

我在mySQL数据库上使用PHP脚本。我所拥有的是为搜索页面提取的产品清单。我的工作正常,我的搜索页面运行完美。我唯一想知道的是如何更新数据库中每个产品的库存。我有一个新文件需要与产品编号匹配,然后替换mysql数据库的一列中的数据。很像下面这个

mysql数据库:

ProductNumber .................. ProductStock

12345678 .................................... 1

新文件:

12345678 .................. 5

基本上我需要新文件与mysql上的产品编号匹配,并用新编号替换产品库存。所有这些都在PHP中。

4 个答案:

答案 0 :(得分:2)

您没有说明您在该数据库中获得了多少行。通常单个UPDATE非常慢。

你可以

  • 使用LOAD DATA INFILE
  • 将“新股票”文件加载到临时表中
  • 使用JOIN进行更新以设置产品表中的值

这将快几个数量级。

使用在mysql上使用的语法进行更新:

UPDATE products p JOIN temp_products t ON (p.id=t.id) SET p.stock = t.stock;

请注意,您需要LOAD DATA INFILE的特殊权限。 您还可以使用LOAD DATA INFILE LOCAL(检查文档)。

或者,您可以使用PHP解析文件,在临时表中生成具有多值的INSERT,并执行联接更新。这将比LOAD DATA INFILE慢一点,但比执行27000次查询要快得多。

答案 1 :(得分:1)

$sql = 'UPDATE table_products SET ProductStock=5 WHERE ProductNumber=12345678';
mysql_query($sql);

基本上:对数据库使用UPDATE语句。

文件如何显示?

答案 2 :(得分:0)

您必须打开文件,使用explode(),然后根据要求使用preg_match

答案 3 :(得分:0)

您可以使用mysql的加载数据本地infile来执行此操作。写一个小的导入脚本,每天在cron上运行它。库存文件是csv格式吗?

示例脚本如下

$dir = dirname(__FILE__) . DIRECTORY_SEPARATOR;
$stock_file = $dir . "files". DIRECTORY_SEPARATOR."stock.csv";

$stock_query = "
    load data local infile \"{$stock_file}\"
    replace into table products
    fields terminated by ',' enclosed by '\"'
    lines terminated by '\n'
    ignore 1 lines
    (ProductNumber,ProductStock);
";

$m->query($stock_query);

要考虑的事项是字段被终止和封闭的内容。如果文件有一行,忽略1行也会忽略标题行。