2013-10-03 2 views
0

Я использую унаследованные таблицы в проекте, используя posgresql.Как добавить ограничение внешнего ключа в унаследованной таблице в postgresql?

Нечто подобное:

create table root 
(
    id bigserial, 
    some_data text, 
    ... 
); 

create table leaf_a 
(
    data2 text 
) inherits(root); 

create table leaf_b 
(
    maybe_other_data text 
) inherits(root); 

Все прекрасно работает до сих пор.

Но недавно я добавил таблицу, которая является отношение один к одному, что при использовании на leaf_a и leaf_b, поэтому я создал так:

create table conf 
(
    id bigserial, 
    root_id bigint, 
    more_data text 
); 

До сих пор так хорошо, но теперь я хочу создать ограничение:

alter table conf 
    add constraint plop foreign key (root_id) references root (id); 

Postgres позволяет мне создать ограничение.

Так что я добавить данные:

insert into leaf_a (some_data, data2) values ('...', '...'); 

позволяет сказать, что идентификатор генерируется (идентификатор из корневой таблицы) составляет 42, я хочу сейчас, чтобы добавить данные в таблицу конф:

insert into conf (root_id, more_data) values (42, '...'); 

И вот в чем проблема, postgres говорит мне, что нет данных с id = 42 в корне таблицы.

Хорошо, так как я могу обойти эту проблему?

Заранее спасибо.

+2

Вы уже читали раздел документации Определение данных/Наследование/Предостережения? В нем упоминаются ограничения в этом сценарии. –

+0

Хорошо, я переключился так, как сделана связь между conf, root и листьями. Теперь я ограничиваю каждую таблицу листьев и корень. –

+1

@ iXô Работает ли это для вас? Если да, не могли бы вы добавить это в качестве ответа и принять его? –

ответ

0

Редизайн схемы базы данных (корень имеет ссылку на таблицу conf, так что делайте leaf_a и leaf_b), и добавление 3 ограничений (на root, leaf_a и leaf_b) работает для меня.