powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как существующую таблицу сделать наследуемой от другой таблицы ?
8 сообщений из 8, страница 1 из 1
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #33131039
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблицы-справочники tab1, tab2, tab3, на которые ссылаются куча объектов в базе - триггеры, функции, записи других таблиц. Нужно создать таблицу-родителя tabspr.

Понятно, что если б tab1, tab2, tab3 не было, все было бы просто:
create table tabspr ...;
create table tab1 ... inherits (tabspr);
create table tab2 ... inherits (tabspr);
create table tab3 ... inherits (tabspr);

А так что делать ? Приходит в голову только длинный путь:
alter table tab1 rename to tab1cop;
alter table tab2 rename to tab2cop;
alter table tab3 rename to tab3cop;
create table tab1 ... inherits (tabspr);
create table tab2 ... inherits (tabspr);
create table tab3 ... inherits (tabspr);
insert into tab1 select * from tab1cop;
insert into tab2 select * from tab2cop;
insert into tab3 select * from tab3cop;
drop table tab1 cascade;
drop table tab2 cascade;
drop table tab3 cascade;
после чего пересоздавать все функции, триггеры и foreign keys, раздавать по-новой права, делать vacuum.

А проще никак нельзя ? :(
...
Рейтинг: 0 / 0
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #33139865
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже что никак. Просто так наследование не сделаешь.
...
Рейтинг: 0 / 0
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #33139872
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[off]
Код: plaintext
1.
2.
3.
drop table tab1 cascade;
drop table tab2 cascade;
drop table tab3 cascade;

Ну и насчет этих строк меня терзают сомнения:
Может быть
Код: plaintext
1.
2.
3.
drop table tab1cop cascade;
drop table tab2cop cascade;
drop table tab3cop cascade;
...
Рейтинг: 0 / 0
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #33140014
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин Роман[off]



хотя вопрос конечно интересный (сдается, что он может быть и в принципе нерешаем иначе чем (возможно скрытое от пользователя какой нить ф-ей) приведенное решение.
Но сама постановка вопроса о возможности доопределить предка (а не потомка) по части набора столбцов и необходимости инструкций в языке для этого - вполне закономерна.


ззы. кстати кроме указанного надо-бы перезапустить создание всех функций (хранимки), обращавшиеся к переопределяемым таблицам, и пересоздать все триггера и т.п., буде такие имеются. (т.е. подмена внутри навороченной структуры будет весьма накладна, имеет смысл продумать хранимку по пересозданию таблиц с подменой оидов во всех связанных объектах).
...
Рейтинг: 0 / 0
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #33140023
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 ззы. кстати кроме указанного надо-бы перезапустить создание всех функций (хранимки)

как вариант - подъем из полного дампа, с предварительной правкой файла дампа в части определения таблиц (добавление предка и правка определений таблиц). Но это - если пользователей можно на время отключить.
...
Рейтинг: 0 / 0
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #33648844
Собственно проапгрейдить родителями - у меня тоже сабж... (к сожалению лучше приведенных вариантов я тоже пока ничего не сообразил). У меня отключать юзверей нельзя даже на пару секунд.. иначе катастрофа :)

strizhЕсть таблицы-справочники tab1, tab2, tab3, на которые ссылаются куча объектов в базе - триггеры, функции, записи других таблиц. Нужно создать таблицу-родителя tabspr

Офф: имейте ввиду, что триггеры не наследуются, поскольку реализация INHERITS фактически напоминает нечто вроде прикрытого UNION ALL. Т.е. добавив предка триггеры всё-равно придётся описывать для всех детей. (а жаль)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #35029711
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант...
Можно реализовать "неявное" наследование через триггер.
Дочерние таблицы трогать не нужно, механизм наследования не используется.
Достаточно создать(доопределить) новую родительскую таблицу и триггер на вставку.
В этом триггере выполять реальную вставку в одну из "дочерних таблиц".
...
Рейтинг: 0 / 0
Как существующую таблицу сделать наследуемой от другой таблицы ?
    #35056244
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читали ?
http://www.postgresql.org/docs/8.2/interactive/sql-altertable.html
Если отвечать на поставленный вопрос, то :

Код: plaintext
1.
2.
3.
4.
create table tabspr ...;
alter table tab1 INHERIT tabspr;
alter table tab2 INHERIT tabspr;
alter table tab3 INHERIT tabspr;
Но учитывать :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
INHERIT parent_table
This form adds the target table as a new child of the specified parent table. 
Subsequently, queries against the parent will include records of the target table. 
To be added as a child, the target table must already contain all the same columns 
as the parent (it could have additional columns, too). 
The columns must have matching data types, 
and if they have NOT NULL constraints in the parent then they must 
also have NOT NULL constraints in the child. 

There must also be matching child-table constraints for all CHECK constraints of the parent. 
Currently UNIQUE, PRIMARY KEY, and FOREIGN KEY constraints are not considered, 
but this may change in the future. 
Но в качестве source для foreign key поля вы использовать не сможете, здесь важно физическое расположение данных.
Просто создайте таблицу tabspr, triggers, перенесите данные, измените зависимости. Все делать в транзакции.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как существующую таблицу сделать наследуемой от другой таблицы ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]