たとえば、これを実行して、特定の行を参照できるサブテーブルが1つだけになるようにすることができます。
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」のいずれかが必要であるため、外部キー参照を満たすことができるのはサブテーブルの1つだけです。
コメントを再確認してください:
私の理解では、INHERITSの現在のPostgreSQL実装では、インデックス、一意の制約、および外部キー制約に関連する多くの異常が許可されています。この機能の使用は注意が必要で、エラーが発生しやすくなります。
基本的に、インデックスは単一のテーブルにのみ存在するため、親テーブルに一意の制約がある場合、親とそのすべての子にその一意性をどのように適用できますか?子は、親にすでに存在する値をテーブルに挿入することも、親が子の1つにすでに存在する値を挿入することもできます。
同様に、同じ主キーまたは一意の値を持つ親/子に複数の行が存在する可能性がある場合、どの行が参照されるかがあいまいであるため、外部キーは親テーブルやその子を参照できません。
これらは、PostgreSQLのINHERITSの既知の未解決の制限です。上に示した設計では、主キーの問題は解決されますが、二次一意キーの問題は解決されません。
http://archives.postgresql.org/pgsql-hackers/2010 -05 / msg00285.php