Наследование PostgreSQL работает не совсем так, как вы ожидаете. Да, вы можете видеть информацию из дочерних таблиц при запросе родительской таблицы, но это не распространяется на отношения внешнего ключа. Строка «принадлежит» ребенку, а не родителю. Ссылка на внешний ключ не касается дочернего элемента.
Как правило, плохая идея использовать наследование в PostgreSQL, за исключением особых случаев, таких как создание временной системы или соблюдение соглашений об именах (например, интерфейсы в ООП, а не наследование состояний).
Наследование PostgreSQL может быть очень мощным, но, на мой взгляд, оно обычно используется слишком часто. Уже существует решение (и совместимое с несколькими базами данных), которое более точно следует традиционной реляционной модели.
Лучшая модель, которая будет выполнять то, что вам кажется, выглядит следующим образом:
CREATE TABLE "user" (
user_id serial PRIMARY KEY, -- Or UUID or generated column in newer versions
-- other fields that all "children" should share
);
CREATE TABLE user_child (
user_id integer NOT NULL
REFERENCES "user" (user_id) ON UPDATE CASCADE ON DELETE CASCADE,
-- other fields specific to the child
);
CREATE TABLE homework (
homework_id serial PRIMARY KEY,
user_id integer NOT NULL
REFERENCES "user" (user_id) ON UPDATE CASCADE ON DELETE RESTRICT,
-- other fields specific to homework
);
Эквивалент вашего запроса для user_child:
SELECT u.user_id
FROM "user" AS u
INNER JOIN user_child AS uc;
И для запроса пользователя родитель и потомок по-прежнему будут
SELECT u.user_id
FROM "user" AS u;
Добавление внутреннего объединения довольно тривиально и может быть скрытоза взглядом. Теперь ссылка на внешний ключ для пользователя будет работать правильно.