mysql LOAD DATA INFILE更新

时间:2012-09-08 09:52:51

标签: mysql

我目前正在使用mySQL LOAD DATA INFILE将csv文件插入到我的数据库中。此csv文件每天下载到服务器,以使产品数据保持最新。

我想知道的是如何使用新的csv更新表并保留现有数据并没有区别?

这是我目前的陈述:

LOAD DATA LOCAL INFILE '$file' REPLACE INTO TABLE products FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\' IGNORE 1 LINES (aw_product_id,merchant_id,merchant_image_url,aw_deep_link,description,in_stock,merchant_name,brand_name,display_price,product_name,rrp_price,merchant_category

这很好但是它用一个全新的集合替换了ID列,并且还将我想要忽略的列恢复为默认状态。例如,我有一个名为'Published'的列,其值为0或1.如果我使用REPLACE,则将该列设置为0。

如何使用REPLACE但忽略某些列?

2 个答案:

答案 0 :(得分:5)

的答案如何使用REPLACE而忽略某些列? 你不能REPLACE总是替换一个完整的行,而不是单个行该行的字段值。

我能否实现目标的答案:我的建议是LOAD DATA LOCAL INFILE到另一个表,然后使用存储过程或查询主表的INSERTUPDATE(而不是REPLACE)。如果您向我们提供更多信息(表格结构,哪个列与已加载数据与现有数据相匹配),我们可能会为您提供进一步的帮助。

答案 1 :(得分:2)

如果要扩充/更改表格

首先LOAD DATA进入tmp_table。 然后使用它来创建新行或更新现有行:

INSERT INTO real_table
    SELECT ... FROM tmp_table
    ON DUPLICATE KEY UPDATE
        a = VALUES(a), ...

如果此表非常大,请考虑" chunking"那些IODKU。有关分块提示,请参阅my blog

注意:IODKU需要UNIQUE(可能PRIMARYKEY来控制哪一行UPDATE

如果更换整个,那就更好了:

CREATE TABLE new LIKE real;
LOAD DATA ... INTO new;
RENAME TABLE real TO old, new TO real; -- atomic and fast (no downtime)
DROP TABLE old;

<强>替换

不要使用REPLACE;它是DELETEINSERT。如果你有AUTO_INCREMENT,那么这些ID就会被丢弃(&#34;烧掉&#34;),几个月之后你就会用完ids。