Конечно, вы можете сделать это, например, для обеспечения того, чтобы только одна вложенная таблица могла ссылаться на данную строку:
CREATE TABLE Super_Table (
super_id SERIAL PRIMARY KEY,
sub_type CHAR(1) NOT NULL,
UNIQUE KEY (super_id, sub_type)
);
CREATE TABLE Sub_Table_A (
super_id PRIMARY KEY,
sub_type CHAR(1) NOT NULL,
CHECK (sub_type = 'A'),
FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);
CREATE TABLE Sub_Table_B (
super_id PRIMARY KEY,
sub_type CHAR(1) NOT NULL,
CHECK (sub_type = 'B'),
FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);
Теперь в Super_Table нет возможности ссылаться на строку в обеих вложенных таблицах. Строка в Super_Table должна иметь «A» или «B», поэтому только одна из вложенных таблиц может соответствовать ссылке на внешний ключ.
Ваш комментарий:
Насколько я понимаю, текущая реализация INHERITS в PostgreSQL допускает ряд аномалий, связанных с индексами, уникальными условиями и ограничениями внешнего ключа. Использование этой функции сложно и подвержено ошибкам.
По сути, поскольку индексы существуют только для одной таблицы, если у вас есть уникальное ограничение для родительской таблицы, то как она может обеспечить эту уникальность для родительского элемента и всех его дочерних элементов? Дочерние элементы могут вставлять значения в свои таблицы, которые уже существуют в родительском элементе, или родительский элемент может вставлять значение, которое уже существует в одном из дочерних элементов.
Аналогичным образом внешние ключи не могут ссылаться на родительскую таблицу и / или ее дочерние элементы, поскольку неоднозначно, на какую строку ссылаются, если в родительском / дочернем элементе может существовать несколько строк с одинаковым первичным ключом или уникальным значением.
Это известные и неразрешенные ограничения НАСЛЕДОВАНИЯ в PostgreSQL. Дизайн, который я показал выше, решает проблему для первичного ключа, но не для вторичных уникальных ключей.
http://archives.postgresql.org/pgsql-hackers/2010-05/msg00285.php