postgresql中的主键和外键 - 总初学者

时间:2014-05-22 06:05:51

标签: postgresql foreign-keys primary-key

任何人都可以解释我如何连接这些表吗? 我必须能够列出一个国家的人口,列出一个城市的人口,并列出公司中每个城市的员工人数!唯一的限制是城市名称是唯一的,公司只能在一个城市出现一次,但在一个国家可以有多个分支。

我制作了国家/地区,公司和城市表,但我无法理解如何正确连接它们并获得此功能。我观看了一些youtube教程并阅读了很多帖子,但我似乎仍然无法使其工作。如果有人可以提供帮助,我会很感激。非常感谢你们!

1 个答案:

答案 0 :(得分:0)

列表中缺少的一个实体是branch(公司的)。表定义是:

CREATE TABLE country (
  id         integer NOT NULL PRIMARY KEY,
  name       varchar NOT NULL,
  population integer NOT NULL
);

CREATE TABLE city (
  id         integer NOT NULL PRIMARY KEY,
  name       varchar NOT NULL,
  population integer NOT NULL,
  country    integer NOT NULL REFERENCES country(id)
);

简单。您有一个国家/地区列表和一系列城市。城市记录有一列country,它引用country表中的正确记录。城市名称未设置UNIQUE,因为不同的国家/地区可以使用相同名称的城市(英语,荷兰语,葡萄牙语和西班牙语帝国创建了具有旧名称的新城市,这些城市有时可以区分(纽约)但并非总是如此(例如作为墨尔本))。如果您确实希望城市名称是唯一的,请将UNIQUE子句附加到name列。

CREATE TABLE company (
  id         integer NOT NULL PRIMARY KEY,
  name       varchar NOT NULL
);

CREATE TABLE branch (
  company    integer NOT NULL REFERENCES company(id),
  city       integer NOT NULL REFERENCES city(id),
  name       varchar,
  employees  integer NOT NULL,
  PRIMARY KEY (company, city)
);

这里的诀窍是公司分支机构的PK是根据公司标识符和城市标识符组合定义的。 PK在表中始终是唯一的。

假设您在单个查询中需要人口计数和员工,这可以解决问题:

SELECT
  company.name AS company,
  branch.name AS branch,
  city.name AS city,
  branch.employees,
  city.population AS city_pop,
  country.population AS country_pop
FROM company
JOIN branch ON branch.company = company.id
JOIN city ON city.id = branch.city
JOIN country ON country.id = city.country
ORDER BY company.name, branch.name;