【问题标题】:primary and foreign keys in postgresql - total beginnerpostgresql 中的主键和外键 - 初学者
【发布时间】:2014-05-22 06:05:50
【问题描述】:

谁能解释我如何连接这些表? 我必须能够列出一个国家的人口、一个城市的人口以及一家公司所在每个城市的员工人数!唯一的限制是城市名称是唯一的,公司只能在一个城市出现一次,但可以在一个国家/地区拥有多个分支机构。

我制作了国家、公司和城市表,但我不明白如何正确连接它们并获得此功能。我看了一些 youtube 教程并阅读了很多帖子,但我似乎仍然无法让它发挥作用。如果有人可以提供帮助,我将不胜感激。非常感谢各位!

【问题讨论】:

  • 请添加您目前尝试过的表定义(CREATE TABLE (...)

标签: postgresql foreign-keys primary-key


【解决方案1】:

您的列表中缺少一个实体是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;

【讨论】:

  • 非常感谢!!!我试图只用 3 张桌子来做到这一点,这是不可能的,老实说,这对我来说没有任何意义。这对我来说非常有用,因为我是数据库的新手。真心欣赏!!!保重
  • 我怎样才能只查询每个公司在每个国家/地区拥有的员工人数?我只需要 3 列作为结果,国家、公司和员工,但其中只有两列通过键直接连接?谢谢!!
  • 我想说你有一个新问题,就这样发布吧。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2011-09-28
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多