Наследование — это концепция объектно-ориентированных баз данных. Это открывает интересные новые возможности проектирования баз данных.

Создадим две таблицы: Таблица citiesи Таблица capitals. Естественно, столицы также являются городами, поэтому вы хотите каким-то образом неявно показать столицы, когда вы перечисляете все города. Если вы действительно умны, вы можете придумать такую ​​схему:

CREATE TABLE capitals (
  name       text,
  population real,
  elevation  int,    -- (in ft)
  state      char(2)
);

CREATE TABLE non_capitals (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

CREATE VIEW cities AS
  SELECT name, population, elevation FROM capitals
    UNION
  SELECT name, population, elevation FROM non_capitals;

Это работает нормально, когда идет запрос, но становится некрасиво, когда вам нужно обновить несколько строк, с одной стороны.

Лучшее решение таково:

CREATE TABLE cities (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

CREATE TABLE capitals (
  state      char(2) UNIQUE NOT NULL
) INHERITS (cities);

В этом случае строка capitals наследует все столбцы ( name, population, и elevation) от своего родителя , cities. Тип столбца nametextсобственный тип PostgreSQL для символьных строк переменной длины. В capitalsтаблице есть дополнительный столбец state, который показывает аббревиатуру штата. В PostgreSQL таблица может наследовать от нуля или более других таблиц.

Например, следующий запрос находит названия всех городов, включая столицы штатов, расположенных на высоте более 500 футов:

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

который возвращает:

   name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
 Madison   |       845
(3 rows)

С другой стороны, следующий запрос находит все города, которые не являются столицами штатов и расположены на высоте более 500 футов:

SELECT name, elevation
    FROM ONLY cities
    WHERE elevation > 500;
   name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
(2 rows)

Здесь ONLYперед citiesуказывает, что запрос должен выполняться только для citiesтаблицы, а не для таблиц ниже citiesв иерархии наследования. Многие из уже рассмотренных нами команд — SELECT, UPDATEи DELETE— поддерживают это ONLYобозначение.