我在PostgreSQL中使用继承,但是在使用继承时存在很大的问题。 我有一个父表和2个子表,但我不知道如何在这些表中插入数据。 当我在子表中插入一些数据时,会破坏父主键的唯一性。
父表是:
CREATE TABLE Parent (
pid int not null,
pAttr1 int not null,
primary key (pid)
)
孩子是:
CREATE TABLE child1 (
ChAttr1 int not null
) INHERITS (Parent)
CREATE TABLE child2(
ChAttr2 int not null
) INHERITS (Parent)
当我使用这些INSERT时:
INSERT into Parent values (1,10)
INSERT into Child1 values (1,20,30) --1 for pk, 20 for pAttr1 & 30 for ChAttr1
INSERT into Child2 values (1,50,60)
然后,父表中有3个主键为1的实体!!!
答案 0 :(得分:1)
继承功能的一个严重限制是索引(包括唯一约束)和外键约束仅适用于单个表,而不适用于它们的继承子级。在外键约束的引用端和被引用端均是如此。因此,就上述示例而言:
- 如果我们将
cities.name
声明为UNIQUE
或PRIMARY KEY
,则不会阻止capitals
表中包含名称重复cities
中的行的行。默认情况下,这些重复的行将显示在来自cities
的查询中。
如果您SELECT * FROM parent
,则PostgreSQL有效执行:
SELECT pid, pattr1 FROM parent
UNION ALL
SELECT pid, pattr1 FROM child1
UNION ALL
SELECT pid, pattr1 FROM child2;
您可以查看EXPLAIN
的输出来验证这一点。