MySQL- 将与现有数据匹配的列加载到先前的 table

MySQL- load columns into a previous table that match with the existent data

我在更新数据时遇到问题。所以事情是这样的: 1) 我加载了 mysql 与每日气候数据相对应的数据转储。我有 18 tables 每日数据(每个参数一个 table)。我的目标是将它们合并为一个 table。

Table 1

station| dayOfYear| temp|

1|  20010101|   2|

2|  20010101|   3|

3|  20010101|   4|

1|  20010102|   3|

2|  20010102|   4|

3|  20010102|   4|

Table 2

station|    dayOfYear|  humidity

1|  20010101|   20|

2|  20010101|   35|

3|  20010101|   100|

1|  20010102|   14|

2|  20010102|   40|

3|  20010102|   80|

2)正如您在示例 (table1 和 table2) 中看到的,所有这些 table 都是共享的"station" 和 "dayOfYear" 列。因此,

3) 我最初的计划是,一旦上传了每个转储,我就会在我的 "TargetTable" 中更新(我之前创建过,它包含每个参数一列和共享列 "Station" 和 "dayOfYear") 每个转储,所以最后我会有一个 table 每个参数每天的数据。 我的计划没有奏效,我有超过 200 万行,查询持续了几个小时 运行,最后连接丢失了。所以我会得到这样的东西:

目标Table

站|dayOfYear|temp|humidity

1| 20010101| 2| 20

2| 20010101| 3| 35

3| 20010101| 4| 100

1| 20010102| 3| 14

2| 20010102| 4| 40

3| 20010102| 4| 80

由于我的计划(通过连接获取 TargeTable)没有奏效,我想知道是否可以在 mysql 中将列添加到 "Targettable",因为开始,在上传 csv 的时候。

类似于:

LOAD DATA LOCAL
INFILE 'C:/Daily/temp.csv'
INTO TABLE TargetTable
CHARACTER SET UTF8
FIELDS TERMINATED BY ',' 
optionally ENCLOSED BY '"' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 rows( stn, dayOfYear, temp, humidity);

 LOAD DATA LOCAL
INFILE 'C:/Daily/hum.csv'
INTO TABLE TargetTable
SET
  humidity= ...?? **what would come here??**

你知道怎么做吗?您对如何处理此问题还有其他建议吗? 仅供参考。我已经修改了 运行 查询的时间。

我看到另一个 post 和你一样问。 提高速度的方法是使用一些自定义脚本逐行插入列。 在另一方面。 FWIW 以下步骤导致 LOAD DATA INFILE 的巨大加速:

SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
SET sql_log_bin = 0;
#LOAD DATA LOCAL INFILE....
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
SET SESSION tx_isolation='READ-REPEATABLE';

更多信息请见Best practices for importing large CSV files

使用 on duplicate mysql 功能。在这里你可以实现它:

1-准备

a] 创建临时 table

CREATE TEMPORARY TABLE tmpTarget LIKE TargetTable;

b] 改变 TargetTable 键

ALTER TABLE TargetTable 
DROP PRIMARY KEY
ADD PRIMARY KEY (stn, dayOfYear);

2-例程

a] 将温度数据插入真实目标 table(就像你已经做的那样)

LOAD DATA LOCAL
INFILE 'C:/Daily/temp.csv'
INTO TABLE TargetTable
CHARACTER SET UTF8
FIELDS TERMINATED BY ',' 
optionally ENCLOSED BY '"' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 rows( stn, dayOfYear, temp, humidity);

b]先将湿度数据插入tmptable

LOAD DATA LOCAL
INFILE 'C:/Daily/hum.csv'
INTO TABLE tmpTarget
CHARACTER SET UTF8
FIELDS TERMINATED BY ',' 
optionally ENCLOSED BY '"' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 rows( stn, dayOfYear, temp, humidity) set @temp=null;

c] 从 tmp table

更新或插入数据到真实目标 table
INSERT INTO TargetTable
SELECT * FROM tmpTarget
ON DUPLICATE KEY UPDATE humidity = VALUES(humidity);

d] 截断 tmp table

TRUNCATE tmpTarget;