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]先将湿度数据插入tmp
table
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;
我在更新数据时遇到问题。所以事情是这样的: 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]先将湿度数据插入tmp
table
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
更新或插入数据到真实目标 tableINSERT INTO TargetTable
SELECT * FROM tmpTarget
ON DUPLICATE KEY UPDATE humidity = VALUES(humidity);
d] 截断 tmp table
TRUNCATE tmpTarget;