Inheritance is a concept from object-oriented databases. It opens
up interesting new possibilities of database design.
Let's create two tables: A table cities
and a table capitals. Naturally, capitals
are also cities, so you want some way to show the capitals
implicitly when you list all cities. If you're really clever you
might invent some scheme like this:
CREATE TABLE capitals (
name text,
population real,
altitude int, -- (in ft)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
altitude int -- (in ft)
);
CREATE VIEW cities AS
SELECT name, population, altitude FROM capitals
UNION
SELECT name, population, altitude FROM non_capitals;
This works OK as far as querying goes, but it gets ugly when you
need to update several rows, to name one thing.
A better solution is this:
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
In this case, a row of capitals
inherits all columns (name,
population, and altitude) from its
parent, cities. The
type of the column name is
text, a native PostgreSQL
type for variable length character strings. State capitals have
an extra column, state, that shows their state. In
PostgreSQL, a table can inherit from
zero or more other tables.
For example, the following query finds the names of all cities,
including state capitals, that are located at an altitude
over 500 ft.:
SELECT name, altitude
FROM cities
WHERE altitude > 500;
which returns:
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
Madison | 845
(3 rows)
On the other hand, the following query finds
all the cities that are not state capitals and
are situated at an altitude of 500 ft. or higher:
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
(2 rows)
Here the ONLY before cities
indicates that the query should be run over only the
cities table, and not tables below
cities in the inheritance hierarchy. Many
of the commands that we have already discussed --
SELECT, UPDATE, and
DELETE -- support this ONLY
notation.