Использование наследования таблиц в PostgreSQL
Создание таблицы - наследника:CREATE TABLE child INHERITS parent;
IMHO, использование наследования таблиц имеет смысл в случае, когда
<sup>*</sup> 2004-01-02: см. PostgreSQL Documentation, p. 2.5 Inheritance:
A limitation of the inheritance feature is that indexes (including unique constraints) and foreign key constraints only apply to single tables, not to their inheritance children. Thus, in the above example, specifying that another table's column REFERENCES cities(name) would allow the other table to contain city names but not capital names. This deficiency will probably be fixed in some future release.
Как временное решение (до разрешения проблемы): вместо REFERENCES делать CHECK, и проверять наличие ключа в таблице-родителе. Это обеспечивает целостность базы при условии постоянства значений PRIMARY KEY таблицы-родителе.
Согласно выводу EXPLAIN, в базе наследники храняться как _отдельные_ таблицы, выборки по наследникам идут по одной таблице, а по родителям - по родительской таблице + таблцицы наследников (т.е. через некий встроенный UNION).
1. Создание таблиц:
CREATE TABLE base ( id SERIAL PRIMARY KEY, txt TEXT, type CHAR(5) NOT NULL DEFAULT 'base' ); CREATE TABLE base_t ( foo_t TEXT ) INHERITS (base); ALTER TABLE base_t ALTER COLUMN type SET DEFAULT 'text'; CREATE TABLE base_i ( foo_i INTEGER ) INHERITS (base); ALTER TABLE base_i ADD PRIMARY KEY (id); ALTER TABLE base_i ALTER COLUMN type SET DEFAULT 'int'; CREATE TABLE base_b ( foo_b BOOLEAN ) INHERITS (base); ALTER TABLE base_b ALTER COLUMN type SET DEFAULT 'bool';
2. Структура таблиц:
naf=# \d base_t Таблица "public.base_t" Колонка | Тип | Модификаторы ---------+--------------+------------------------------------------------------ id | integer | not null default nextval('public.base_id_seq'::text) txt | text | type | character(5) | not null default 'text' foo_t | text |
3. Наполнение таблиц:
INSERT INTO base (txt) VALUES ('Base table - 1'); INSERT INTO base (txt) VALUES ('Base table - 2'); INSERT INTO base (txt) VALUES ('Base table - 3'); INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 1','Foo - 1'); INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 2','Foo - 2'); INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 3','Foo - 3'); INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 4','Foo - 4'); INSERT INTO base_i (txt,foo_i) VALUES ('Foo_i table - 1',1); INSERT INTO base_i (txt,foo_i) VALUES ('Foo_i table - 2',2); INSERT INTO base_i (txt,foo_i) VALUES ('Foo_i table - 3',3); INSERT INTO base_b (txt,foo_b) VALUES ('Foo_b table - 1',True); INSERT INTO base_b (txt,foo_b) VALUES ('Foo_b table - 2',False);
4. Выборки:
naf=# SELECT * FROM base; id | txt | type ----+-----------------+------- 1 | Base table - 1 | base 2 | Base table - 2 | base 3 | Base table - 3 | base 4 | Foo_t table - 1 | text 5 | Foo_t table - 2 | text 6 | Foo_t table - 3 | text 7 | Foo_t table - 4 | text 8 | Foo_i table - 1 | int 9 | Foo_i table - 2 | int 10 | Foo_i table - 3 | int 11 | Foo_b table - 1 | bool 12 | Foo_b table - 2 | bool (записей: 12) naf=# SELECT * FROM base_t; id | txt | type | foo_t ----+-----------------+-------+--------- 4 | Foo_t table - 1 | text | Foo - 1 5 | Foo_t table - 2 | text | Foo - 2 6 | Foo_t table - 3 | text | Foo - 3 7 | Foo_t table - 4 | text | Foo - 4 (записей: 4)
Дата создания: 2006-05-24 12:51:53 (Фетисов Н. А. (naf))
Последнее изменение: 2006-05-24 12:51:53 (Фетисов Н. А. (naf))
Владелец: Фетисов Н. А. (naf)
Версия: 1
Wiki::Admin Карта раздела Оглавление Изменения за сутки Изменения за неделю Изменения за месяц