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

时间:2019-03-29 14:34:27

标签: mysql sql mariadb

我正在创建一个包含国家和年份特定数据的数据库。我有一张国家/地区的表格,其中包含每个国家/地区的名称,联合国代码(数字),两位数字的字母代码,三位数字的字母代码和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代码仅对应于一个2位数字的alpha码,一个3位数字的alpha码和一个ISO码。我希望能够导入仅包含这些代码之一的CSV,并让数据库自动为每一行填充其他代码的条目。例如,如果我导入了用联合国代码编码的人口数据,数据库将自动引用“国家”表中的相应其他代码并插入适当的值。

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

2 个答案:

答案 0 :(得分:0)

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

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

表国家/地区代码

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

答案 1 :(得分:0)

  1. 确定country_code在任何地方都应使用哪个country_code。 (您将保留所描述的表,该表显示了ISO,UN等之间的映射。)
  2. LOAD DATA ...-但不能直接进入真实表。而是进入表t
  3. t中添加一列,然后在ISO / UN / etc表中查找每个代码,并将country_code值放入。
  4. 然后将t中的行复制到实际表中。请注意,“真实”表将仅具有首选的country_code

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

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