Полная версия

OSS Group


Авторизация

  

Навигация

Текущее местоположение:  OSS Group :: Wiki :: Admin :: Наследование таблиц в PostgreSQL
Главное меню:   Главная   Документация   Разработка   Контакты   Поиск   Карта сайта   Wiki   Блоги
Разделы Wiki:   Admin  APT  Sandbox

Наследование таблиц в PostgreSQL

Использование наследования таблиц в 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


 Комментарии (0)


Wiki::Admin   Карта раздела  Оглавление  Изменения за сутки  Изменения за неделю  Изменения за месяц



Быстрый поиск по Wiki:
И ИЛИ

На эту страницу ссылаются:

©2006-2024 OSS Group. All rights reserved. | Техническая поддержка: Открытые Информационные Технологии и Системы