Разбира се, можете да направите това, например, за да наложите, че само една подтаблица може да препраща към даден ред:
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' и така само една от подтаблиците може да удовлетвори препратката към външен ключ.
Re your comment:
Моето разбиране е, че текущото изпълнение на PostgreSQL на INHERITS позволява редица аномалии, свързани с индекси, уникални съдържания и ограничения на външни ключове. Използването на тази функция е трудно и податливо на грешки.
По принцип, тъй като индексите съществуват само върху една таблица, ако имате уникално ограничение за вашата родителска таблица, тогава как може да наложи тази уникалност върху родителя и всички негови деца? Децата могат да вмъкнат стойности в своите таблици, които вече съществуват в родителя, или родителят може да вмъкне стойност, която вече съществува в едно от децата.
По същия начин външните ключове не могат да препращат към родителската таблица и/или нейните деца, тъй като е двусмислено кой ред е препратен, ако могат да съществуват множество редове в родител/деца със същия първичен ключ или уникална стойност.
Това са известни и неразрешени ограничения на INHERITS в PostgreSQL. Дизайнът, който показах по-горе, разрешава проблема за първичния ключ, но не и за вторичните уникални ключове.
http://archives.postgresql.org/pgsql-hackers/2010 -05/msg00285.php