Chapitre 9. Héritage

Créons deux classes. La classe "capitals" contient les capitales d'état qui sont aussi des villes. Naturellement, la classe capitals doit hériter des villes.
CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int            -- (in ft)
);

CREATE TABLE capitals (
    state           char2
) INHERITS (cities);
Dans ce cas, une instance de capitales hérite de tous les attributs (nom, population, et altitude) depuis son parent, villes. Le type d'attibut nom est text, un type Postgres natif pour les chaînes de longueur variables ASCII. Le type d'attibut population est float, un type Postgres natif pour les nombres décimaux en double précision. Les capitales d'état ont un extra attribut, state, qui fournit leur état. Dans Postgres, une classe peut hériter de zéro ou plus autres classes, et une requête peut referencer soit toutes les instances d'une classe soit toutes les instances d'une classe plus tous ses descendants.

Note

la hiérarchie héritage est actuellement un graphe acyclique direct.

Par exemple, les requêtes suivantes trouvent toutes les villes qui sont situées à une altitude de 500ft ou plus :
SELECT name, altitude
    FROM cities
    WHERE altitude > 500;

+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+

D'autre part, pour trouver les noms de toutes les villes, incluant les capitales d'état, qui sont situées à une altitude de plus de 500ft, la requête est :
SELECT c.name, c.altitude
    FROM cities* c
    WHERE c.altitude > 500;
qui renvoie :
+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
|Madison   | 845      |
+----------+----------+
Ici le "*" après cities indique que la requête doit être lancée sur les cities et toutes les classes au-dessous de cities dans la hiérarchie héritage. Plusieurs commandes que nous avons déja vues -- >select, update et delete -- supportent la notation "*", ainsi que d'autres comme alter.