mysql - 批量插入 - 根据另一列的已知值创建一些列的值

标签 mysql sql mariadb

我正在创建一个包含国家和年份特定数据的数据库。我有一个国家/地区表,其中包括每个国家/地区的名称、UN 代码(数字)、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);

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

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

最佳答案

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

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

表国家代码

+----+----+-----+----+----+
| 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;

关于mysql - 批量插入 - 根据另一列的已知值创建一些列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55419717/

相关文章:

php - 自己的数据库数据计数器

mysql临时表权限

mysql - 获取整个表中的平均字符串值

mysql - Nodejs 使用 mysql 模块的 Mysql 连接池

mysql - HAVING vs (subquery) WHERE的SQL引擎执行计划

sql - 解析 SQL - 从表中选择的所有 Teradata 关键字

php - 列中的值

php - fatal error 调用未定义函数mysql_connect()

node.js - Db的数据不断增加

javascript - 如何使用nodejs在mariadb中批量插入?