mysql 如何正确使用LOAD DATA LOCAL INFILE IGNORE 1 LINES来更新现有表?

u91tlkcl  于 2023-04-05  发布在  Mysql
关注(0)|答案(1)|浏览(197)

我使用以下命令从Python成功地将大型CSV文件(具有1个标题行)加载到MySQL表中:

LOAD DATA LOCAL INFILE 'file.csv' 
INTO TABLE 'table" 
FIELDS TERMINATED BY ';' 
IGNORE 1 LINES 
(@vone, @vtwo, @vthree) 
   SET DatumTijd = @vone, 
       Debiet = NULLIF(@vtwo,''),
       Boven = NULLIF(@vthree,'')

这个文件包含了1970年以来的历史数据。每个月我都会得到一个更新,大约有4320行需要添加到现有的表中。
有时会与现有表重叠,所以我想使用REPLACE。但这似乎不适合与IGNORE 1 LINES组合使用。主键是DatumTijd,它遵循MySQL-datetime格式。
我以不同的顺序尝试了REPLACE和IGNORE的几种组合,在INTO TABLE“table”之前和FIELDS TERMINATED部分之后。
有什么建议可以解决这个问题吗?

2izufjch

2izufjch1#

除了用单引号(而不是反引号)括起表名可能存在的拼写错误之外,load语句在我的windows设备上工作正常,给出了以下数据

one;two;three
2023-01-01;1;1
2023-01-02;2;2
2023-01-01;3;3
2022-01-04;;;

注意我更喜欢合并而不是nullif,并包含了一个auto_increment id来演示replace实际上做了什么,即删除和插入。

drop table if exists t;
create table t(
id int auto_increment primary key,
DatumTijd date,
Debiet varchar(1),
boven varchar(1),
unique index key1(DatumTijd)
);

LOAD DATA INFILE 'C:\\Program Files\\MariaDB 10.1\\data\\sandbox\\data.txt' 
replace INTO TABLE t 
FIELDS TERMINATED BY ';' 
IGNORE 1 LINES (@vone, @vtwo, @vthree) 
SET DatumTijd = @vone, 
Debiet = coalesce(@vtwo,''),
Boven = coalesce(@vthree,'')
;

select * from t;

+----+------------+--------+-------+
| id | DatumTijd  | Debiet | boven |
+----+------------+--------+-------+
|  2 | 2023-01-02 | 2      | 2     |
|  3 | 2023-01-01 | 3      | 3     |
|  4 | 2022-01-04 |        |       |
+----+------------+--------+-------+
3 rows in set (0.001 sec)

replace实际上创建了一条新记录,但如果它确实创建了一条新记录,那么请考虑加载到staging表中,然后在重复键上插入..到target

相关问题