4

我目前正在使用 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 但忽略某些列?

4

2 回答 2

6

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

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

于 2012-09-08T10:05:12.810 回答
3

如果增加/更改表格:

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

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

如果此表很大,请考虑对这些 IODKU 进行“分块”。有关分块技巧,请参阅我的博客

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

如果替换整个table,那么这会好得多:

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;这是一个DELETE加号INSERT。如果你有AUTO_INCREMENT,那么这些 id 将被丢弃(“烧毁”),几个月后你可能会用完 id。

于 2015-08-09T21:51:52.660 回答