Postgresql 如何将这些邮政编码导入规范化表?

Postgresql 如何将这些邮政编码导入规范化表?,postgresql,csv,import,Postgresql,Csv,Import,我得到了一个CSV,其中包含如下数据: A0A0A0,48.5674500000,-54.8432250000,Gander,NL A0A1A0,47.0073470000,-52.9589210000,Aquaforte,NL A0A1B0,47.3622800000,-53.2939930000,Avondale,NL 但我的数据库是规范化的,因此城市和省份都在单独的表中,每个表都有自己的ID列 那么,将该文件导入3个单独的表并正确链接外键的最简单方法是什么 更清楚地说,表格是 citi

我得到了一个CSV,其中包含如下数据:

A0A0A0,48.5674500000,-54.8432250000,Gander,NL
A0A1A0,47.0073470000,-52.9589210000,Aquaforte,NL
A0A1B0,47.3622800000,-53.2939930000,Avondale,NL
但我的数据库是规范化的,因此城市和省份都在单独的表中,每个表都有自己的ID列

那么,将该文件导入3个单独的表并正确链接外键的最简单方法是什么


更清楚地说,表格是

cities (id, name, province_id)
provinces (id, code, name, country_id)
postal_codes (id, code, city_id)
countries (id, code, name)

使用
COPY
将csv导入临时表。然后使用一些
插入到。。。选择。。。从…
将数据转储到正确的表中。

。。。我的数据库正常化了

似乎不是。有很多问题,但在这个问题上会绊倒你的是,似乎没有正确的PKs,根本没有唯一的密钥;因此,您将得到重复的数据
Id
“键”不能防止重复的
名称
,您需要在
名称
上有一个唯一的索引。不清楚你是如何支持同一省份中两个同名城镇的

  • 您知道必须从一个导入的表中加载三个表。由于FKs是一件好事,所以您需要先加载省份,然后加载城市,然后加载邮政编码。但从导入文件的外观来看,它是城市(或城镇、地方或郊区)。。。首先需要明确确定这项决议。Gander和Aquaforte之间有360公里和几十个地方。文件中的记录究竟由什么构成

  • 这可能有助于理解优秀的加拿大邮政编码系统的结构

  • 然后需要检查数据库中存储的粒度级别。显然是城市或城镇,但不是郊区,不是地方。县或教区呢?例如
    \u0a\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;因为您存储的是城市,而不是县,不是市,所以可以忽略它们


  • 一旦明确了源数据的粒度或分辨率,以及目标表中所需的分辨率级别,就可以加载导入文件,很可能是每个表有几个wave。SQL很简单。

    你说的“临时表”是什么意思?PostgreSQL中有这样一个概念吗?还是说我应该创建一个表,以后再删除它?编辑:Nvm。是。temp=临时:
    创建临时表foo(bar INT)
    或者,如果是常规活动,则创建一个永久的收件箱表,每次开始之前都会截断该表。您是说一个城市全名的两个相关部分位于两个不同的表中吗?我是说,“甘德”在一张桌子里,“NL”在另一张桌子里?我认为这在美国是行不通的。这里有“阿拉巴马州富兰克林”、“俄亥俄州富兰克林”、“阿肯色州富兰克林”——这里至少有30个富兰克林。(同样重要的是,没有“富兰克林,密西西比”。@Catcall:没有。。。“邮政编码”表具有指向城市的FK。城市表包含省的名称和FK,后者依次指向国家。i、 例如,您可以在不同的州/省拥有重复的城市名称。