Jistě to můžete udělat například pro vynucení toho, že pouze jedna podtabulka může odkazovat na daný řádek:
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)
);
Nyní neexistuje žádný způsob, jak by na řádek v Super_Table mohl odkazovat řádek v obou podtabulkách. Řádek v Super_Table musí mít buď 'A' nebo 'B', takže pouze jedna z podtabulek může vyhovět odkazu na cizí klíč.
K vašemu komentáři:
Chápu to tak, že současná implementace PostgreSQL INHERITS umožňuje řadu anomálií souvisejících s indexy, jedinečnými omezeními a omezeními cizích klíčů. Použití této funkce je složité a náchylné k chybám.
V zásadě, protože indexy existují pouze nad jedinou tabulkou, pokud máte na nadřazenou tabulku jedinečné omezení, jak může vynutit tuto jedinečnost nad nadřazenou a všemi jejími potomky? Děti by mohly do svých tabulek vložit hodnoty, které již existují v nadřazeném prvku, nebo by mohl rodič vložit hodnotu, která již existuje v jednom z potomků.
Stejně tak cizí klíče nemohou odkazovat na nadřazenou tabulku a/nebo její podřízené položky, protože je nejednoznačné, na který řádek se odkazuje, pokud v nadřazeném/podřízeném prvku může existovat více řádků se stejným primárním klíčem nebo jedinečnou hodnotou.
Toto jsou známá a nevyřešená omezení INHERITS v PostgreSQL. Návrh, který jsem ukázal výše, řeší problém pro primární klíč, ale ne pro sekundární jedinečné klíče.
http://archives.postgresql.org/pgsql-hackers/2010 -05/msg00285.php