Вам нужен уникальный идентификатор или первичный ключ на 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);
Я предпочитаю первый подход, но я опубликовал и этот только для академических целей.