PostgreSQL
3.6. Inheritance #
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,
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;
This works OK as far as querying goes, but it gets ugly when you need to update several rows, for one thing.
A better solution is this:
CREATE TABLE cities (
name text,
population real,
elevation int -- (in ft)
);
CREATE TABLE capitals (
state char(2) UNIQUE NOT NULL
) INHERITS (cities);
In this case, a row of capitals
inherits all columns (name
, population
, and elevation
) from its parent, cities
. The type of the column name
is text
, a native PostgreSQL type for variable length character strings. The capitals
table has an additional column, state
, which shows its state abbreviation. 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 elevation over 500 feet:
SELECT name, elevation
FROM cities
WHERE elevation > 500;
which returns:
name | elevation
-----------+-----------
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 elevation over 500 feet:
SELECT name, elevation
FROM ONLY cities
WHERE elevation > 500;
name | elevation
-----------+-----------
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.
Note
Although inheritance is frequently useful, it has not been integrated with unique constraints or foreign keys, which limits its usefulness. See Section 5.10 for more detail.
Prev | Up | Next |
---|---|---|
3.5. Window Functions |
3.7. Conclusion |
Submit correction
If you see anything in the documentation that is not correct, does not match your experience with the particular feature or requires further clarification, please use this form to report a documentation issue.
Copyright © 1996-2024 The PostgreSQL Global Development Group