使用继承时违反主键的唯一性

时间:2019-06-17 18:52:22

标签: sql postgresql

我在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的实体!!!

1 个答案:

答案 0 :(得分:1)

那个is documented

  

继承功能的一个严重限制是索引(包括唯一约束)和外键约束仅适用于单个表,而不适用于它们的继承子级。在外键约束的引用端和被引用端均是如此。因此,就上述示例而言:

     
      
  • 如果我们将cities.name声明为UNIQUEPRIMARY 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的输出来验证这一点。