【问题标题】:Bulk insert - create some columns' values based on another column's known values批量插入 - 根据另一列的已知值创建一些列的值
【发布时间】:2019-03-29 14:34:26
【问题描述】:

我正在创建一个包含国家和年份特定数据的数据库。我有一张国家/地区表,其中包括每个国家/地区的名称、联合国代码(数字)、2 位字母代码、3 位字母代码和 ISO 代码。

此数据库中还有许多其他表,每个表的行都包含国家代码、年份和感兴趣的数据点。例如,“总人口”表的每一行都将包括年份、人口数据以及记录对应的国家/地区的 UN、alpha-2、alpha-3 和 ISO 代码。因此,对于任何给定的国家,都会有很多记录(每年一个)。

挑战:我从多个来源获取数据,而不同的来源使用不同的编码系统。我正在使用 CSV 文件导入所有数据。例如,下面是为国家表加载数据的查询。

LOAD DATA LOCAL INFILE 'data/countryCodes.csv'
INTO TABLE Countries
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(country_name, alpha2_code, alpha3_code, un_code, iso_code);

当然,任何给定的联合国代码仅对应一个 2 位字母代码、一个 3 位字母代码和一个 ISO 代码。我希望能够导入仅包含其中一个代码的 CSV,并让数据库自动填充每一行的其他代码条目。例如,如果我导入了联合国代码编码的人口数据,数据库将自动引用国家表中相应的其他代码并插入适当的值。

有没有办法用 SQL 做到这一点?如果我在数据库中创建此功能,则系统化不同类型数据之间的服务器端和客户端关联会容易得多。

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    老实说,我很难弄清楚您的问题是什么/您真正想要做什么......

    为了在数据库级别上可用,您的最终数据集应如下所示:

    表格国家代码

    +----+----+-----+----+----+
    | id | un | iso | a2 | a3 |
    +----+----+-----+----+----+
    | 1  | FR | FR  | FR | FR |
    | 2  | .. | ..  | .. | .. |
    +----+----+-----+----+----+
    

    表格数量

    +----+------+-----------+----------+
    | id | year | idCountry | value    |
    +----+------+-----------+----------+
    | 1  | 1979 | 1         | 50000000 |
    | 2  | 1980 | 1         | 50000000 |
    +----+------+-----------+----------+
    

    要将“直接”值从 CSV 转换为索引值,可以这样做:

    ALTER TABLE population ADD extCC CHAR(2);
    LOAD DATA LOCAL INFILE 'data/population.csv'
    INTO TABLE population (year,value,extCC)
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS (extCC, year, value);
    
    UPDATE population, countryCode SET population.idCountry=countryCode.id WHERE countryCode.iso = population.extCC;
    
    ALTER TABLE population DROP extCC;
    

    【讨论】:

    • 谢谢...这肯定比它需要的更难通过不仅仅是引用国家的表 id,而不是国家代码之一。
    • 实施后返回 - 这非常有效。谢谢!
    • 很高兴,不要忘记投票并接受答案;)
    【解决方案2】:
    1. 决定在任何地方为country_code 使用哪个country_code。 (您将保留您描述的显示 ISO、UN 等之间映射的表格。)
    2. LOAD DATA ... - 但不是直接进入真实表。而是进入表t
    3. t 添加一列,然后在ISO/UN/etc 表中查找每个代码并将country_code 值放入。
    4. 然后将t 中的行复制到真实表中。请注意,“真实”表将只有首选 country_code

    这里的一般原则是在加载过程中清理和规范不同的数据。当然,这需要额外的步骤,但这是值得的。保持“真正的”桌子干净。

    您将如何处理捷克斯洛伐克 --> 捷克共和国 + 斯洛伐克?还有南斯拉夫。还有上沃尔特——>布基纳法索?等等。

    【讨论】:

      猜你喜欢
      • 2023-02-23
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多