我正在使用MySQL的LOAD DATA INFILE
每晚在cronjob上导入大约150k行的CSV。
表定义很简单(CSV包含除ID以外的所有列):
CREATE TABLE products (
id int(10) unsigned auto_increment
category varchar(30) NOT NULL,
subtype varchar(30) NOT NULL,
manufacturer varchar(50) NOT NULL,
part varchar(100) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY mfg_part (manufacturer,part)
);
问题:
我不知道如何处理删除不再包含在CSV中的记录。
我的尝试:
我的想法是在表中添加一个批号,并使LOAD DATA INFILE用最新的批号更新每个现有记录。然后删除查询将删除批号不是最新的所有记录。用于此的加载数据查询是:
LOAD DATA INFILE '/path/to/products.csv'
REPLACE INTO TABLE `products`
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
(`category`, `subtype`, `manufacturer`, `part`)
SET `batch` = $newBatchNumber
不起作用,因为SET batch
导致MySQL将每一行视为一个完整的新记录,而不是将旧的批号更新为新的。
有解决方法吗?
就目前而言,我能想到的唯一另一种选择是从LOAD DATA INFILE切换到批量的INSERT ... ON DUPLICATE KEY UPDATE查询。