当然您也可以例如这样做是为了强制执行,只有一个子表可以参考给定的行:
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',因此只有一个子表可以满足外键引用。
回复您的评论:
我的理解是,继承了当前PostgreSQL的实现允许一些相关的指标,独特constaints和外键约束异常。使用此功能非常棘手且容易出错。
基本上,因为索引只存在于一张表上,所以如果你的父表上有一个唯一的约束,那么它如何能够强制父对象及其所有子对象的唯一性?孩子可以将值插入父表中已存在的表中,或者父母可以插入其中一个孩子中已经存在的值。
同样,外键不能引用父表和/或其子,因为如果在具有相同主键或唯一值的父/子中可以存在多行,那么引用哪个行是不明确的。
这些是PostgreSQL中INHERITS的已知和未解决的限制。我上面显示的设计解决了主键的问题,但不能解决次要唯一键。
http://archives.postgresql.org/pgsql-hackers/2010-05/msg00285.php
你有什么问题? Spring/Hibernate中的继承与PostgreSQL中的继承有不同的范围。不要试图解决你没有的问题,最终会遇到真正的问题。 – 2010-07-28 09:00:01