我目前正在使用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但忽略某些列?
答案 0 :(得分:5)
的答案如何使用REPLACE而忽略某些列? 你不能:REPLACE
总是替换一个完整的行,而不是单个行该行的字段值。
我能否实现目标的答案是:我的建议是LOAD DATA LOCAL INFILE
到另一个表,然后使用存储过程或查询主表的INSERT
和UPDATE
(而不是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
(可能PRIMARY
)KEY
来控制哪一行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
;它是DELETE
加INSERT
。如果你有AUTO_INCREMENT
,那么这些ID就会被丢弃(&#34;烧掉&#34;),几个月之后你就会用完ids。