Внешний ключ PostgreSQL с наследованием - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть база данных PostgreSQL, 3 таблицы и моя схема следующим образом.enter image description here

CREATE TABLE table_a (
    id SERIAL PRIMARY KEY,
    name_a VARCHAR(255)
);

CREATE TABLE table_b (
    name_b VARCHAR(255) 
) INHERITS (table_a);

CREATE TABLE table_c (
    name_c VARCHAR(255)
) INHERITS (table_a);

insert into table_b (name_a, name_b) values('table A','table B1');
insert into table_b (name_a, name_b) values('table A','table B2');
insert into table_c (name_a, name_c) values('table A','table C1');
insert into table_c (name_a, name_c) values('table A','table C2');

select * from table_a;
select * from table_b;
select * from table_c;

enter image description here

Теперь я хочу добавить ассоциацию между Table B и Table C следующим образом:

enter image description here

Не знаю, возможно ли это, когда мы наследуем одну и ту же таблицу?

Не понимаю, как можносоздать эту ассоциацию?

1 Ответ

0 голосов
/ 18 февраля 2019

Вам нужен уникальный идентификатор или первичный ключ на table_b.Цитирование документов:

Все проверочные и ненулевые ограничения родительской таблицы автоматически наследуются ее дочерними элементами, если явно не указано иное с предложениями NO INHERIT. Другие типы ограничений (ограничения уникального, первичного ключа и внешнего ключа) не наследуются .

CREATE TABLE table_a (
    id SERIAL PRIMARY KEY,
    name_a VARCHAR(255)
);

CREATE TABLE table_b (
    name_b VARCHAR(255),
    primary key (id)     --> here you set the PK
) INHERITS (table_a);

CREATE TABLE table_c (
    name_c VARCHAR(255),
    id_b int references table_b(id) --> the fk to b through pk
) INHERITS (table_a);

Альтернативный способ

На вашей второй диаграмме у вас есть своего рода идентификатор для table_b.Это правильно, потому что вы можете ссылаться на таблицу по уникальному полю.В этом случае DDL будет выглядеть следующим образом:

CREATE TABLE table_a (
    id SERIAL PRIMARY KEY,
    name_a VARCHAR(255)
);

CREATE TABLE table_b (
    name_b VARCHAR(255),
    id_b SERIAL UNIQUE     --> Here the unique id for b
    --, primary key (id)   -- optionally
) INHERITS (table_a);

CREATE TABLE table_c (
    name_c VARCHAR(255),
    id_b int references table_b(id_b)  --> the fk to b through unique
) INHERITS (table_a);

Я предпочитаю первый подход, но я опубликовал и этот только для академических целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...