我必须定期将CSV中的数据导入MySQL数据库。
LOAD DATA LOCAL INFILE '/path/to/file.csv' INTO TABLE `tablename` FIELDS TERMINATED BY ','
我导入的数据没有主键列,同样我也无法改变CSV文件的结构,因为我无法控制它。
所以我需要将这个CSV数据导入一个临时的MySQL表,这很好,但是我需要获取这些数据并逐行处理。当每一行都在一个进程中运行时,我需要从临时表中删除该行,以便我不重新处理它。
因为临时表没有主键我不能做 DELETE FROM tablename WHERE id = X 这是最好的选择,而是我必须匹配一堆字母数字列(可能最多5个,以避免意外删除重复项。)
或者我认为我可以在CSV导入过程完成后更改表格并添加主键列,然后按照前面的说明处理数据。然后,完成后,再次更改表以删除准备进行新导入的主键列。有人可以告诉我这是不是一个愚蠢的想法?什么是最有效和最快速的?
非常感谢任何想法或建议!
答案 0 :(得分:3)
您可以从头开始在临时表中添加auto_increment列,并在加载数据时填充值
CREATE TEMPORARY TABLE tablename
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
col1 INT,
col2 VARCHAR(32),
col3 INT,
...
);
然后在括号中指定所有列,但保留id
LOAD DATA LOCAL INFILE '/path/to/file.csv'
INTO TABLE `tablename`
FIELDS TERMINATED BY ','
(col1, col2, col3,...); -- specify all columns, but leave id out
这样,您无需在导入前后添加和删除id
列。由于您定期进行导入,因此在完成导入以清除表格并重置TRUNCATE
列后,您可以考虑使用永久表而不是临时表,只需id
。 / p>