【问题标题】:MySQL- load columns into a previous table that match with the existent dataMySQL-将与现有数据匹配的列加载到以前的表中
【发布时间】:2018-02-06 09:38:36
【问题描述】:

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

表 1

station| dayOfYear| temp|

1|  20010101|   2|

2|  20010101|   3|

3|  20010101|   4|

1|  20010102|   3|

2|  20010102|   4|

3|  20010102|   4|

表 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) 中看到的,所有这些表共享 "station" 和 "dayOfYear" 列。因此,

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

目标表

站|dayOfYear|温度|湿度

1| 20010101| 2| 20

2| 20010101| 3| 35

3| 20010101| 4| 100

1| 20010102| 3| 14

2| 20010102| 4| 40

3| 20010102| 4| 80

由于我的计划(通过连接获取 TargetTable)不起作用,我想知道从一开始,在上传 csv 时,是否可以在 mysql 中将列添加到“Targettable”。

类似:

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??**

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

【问题讨论】:

    标签: mysql csv load match


    【解决方案1】:

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

    1-准备

    a] 创建一个临时表

    CREATE TEMPORARY TABLE tmpTarget LIKE TargetTable;
    

    b] 更改 TargetTable 键

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

    2-例程

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

    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 表中

    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 表更新或插入数据到真正的目标表

    INSERT INTO TargetTable
    SELECT * FROM tmpTarget
    ON DUPLICATE KEY UPDATE humidity = VALUES(humidity);
    

    d] 截断 tmp 表

    TRUNCATE tmpTarget;
    

    【讨论】:

    • 你是个天才!!作为补充,在步骤 2b 中需要添加 LOAD DATA LOCAL INFILE 'C:/Daily/hum.csv' INTO TABLE tmpTarget CHARACTER SET UTF8 FIELDS TERMINATED BY ','可选 ENCLOSED BY '"' ENCLOSED BY '"'由 '\r\n' 终止的行忽略 1 行(stn、dayOfYear、temp、湿度)设置 @temp=null;否则将湿度放在温度列中,谢谢
    • @Monitotier:很有帮助;)我根据您的测试重新编辑了 [2b]。如果您对它感到满意,我们将非常欢迎您使用 up-voteaccepting my answer
    • 我没有权力给你投票!!太伤心了:(只要我有足够的力量我会做到的:) ...我接受了你的完美答案
    【解决方案2】:

    我看到另一个像你一样问的帖子。 提高速度的方法是使用一些自定义脚本逐行插入列。 在另一方面。 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

    【讨论】:

    • 谢谢!我会通过你发布的这个。我在谷歌上搜索了很多,但由于我没有详细说明这个问题,我什至没有关闭以获得你的建议。谢谢,我去看看
    • 我已经检查了您的建议,但这些行有助于改善加载。我的问题是没有加载。我的问题是执行表之间的连接。这就是为什么我要问是否有一种加载方式:“创建一个加载查询,其中我要添加的表与它的两列 中的预加载表匹配(车站和一年中的一天) ),然后将cvs表的第三个/rest添加到pre-load(targetTable)中。好像我没有解释正确。
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2012-04-11
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多