Вы сталкиваетесь с одной из множества странностей с наследованием: в иерархии наследования нет «глобальных» ограничений, следовательно, вы не можете иметь внешний ключ для иерархии наследования.
Первичный ключ, который вы определилина product
не не распространяется на computer
.
Даже если SELECT
на product
добавит результаты также для потомков наследования, они не являются частьютаблица parent
и, следовательно, не может использоваться в качестве цели для внешнего ключа.Внешний ключ находится между sale
и product
только , потомки наследования исключены.
Не существует подходящего способа сделать это с наследованием.
ЭтоЛучше, чтобы computer
не был потомком наследования продукта, но имел внешний ключ к product
(с уникальным ограничением на него), так что данные для объекта компьютера будутразделить между двумя таблицами.Это несколько неудобно для запросов, но вы можете использовать внешний ключ таким образом.
Вот пример:
CREATE TABLE product (
product_id integer PRIMARY KEY,
prodname text NOT NULL
);
CREATE TABLE computer (
product_id integer PRIMARY KEY,
processor text NOT NULL,
FOREIGN KEY (product_id) REFERENCES product(product_id)
);
CREATE TABLE sale (
sale_id integer PRIMARY KEY,
product_id integer NOT NULL REFERENCES product(product_id)
);
Теперь нет прямой ссылки на внешний ключ от sale
доcomputer
, но поскольку product_id
из computer
и product
идентичны, вы всегда можете найти уникальный компьютер для sale
, если он существует:
SELECT p.prodname, c.processor
FROM sale s
JOIN product p USING (product_id)
LEFT JOIN computer c USING (product_id)
WHERE sale_id = 42;
Если у вас есть больше«подтипы» товара, вы можете добавить больше левых соединений.