带继承的PostgreSQL外键约束冲突

带继承的PostgreSQL外键约束冲突,sql,postgresql,foreign-keys,Sql,Postgresql,Foreign Keys,我有一个PostgreSQL数据库、3个表和我的模式,如下所示 --- Parent Table CREATE TABLE IF NOT EXISTS abc.parent( record_id SERIAL PRIMARY KEY, description text NOT NULL ); --- Child Table CREATE TABLE IF NOT EXISTS abc.child ( total_count INT N

我有一个PostgreSQL数据库、3个表和我的模式,如下所示

--- Parent Table

CREATE TABLE IF NOT EXISTS abc.parent(
    record_id         SERIAL PRIMARY KEY,
    description       text NOT NULL
);

--- Child Table


CREATE TABLE IF NOT EXISTS abc.child ( 
    total_count INT NOT NULL)  INHERITS (abc.parent);

-- Detail

CREATE TABLE abc.detail(
    detail_id      int NOT NULL,
    detail_description       text NOT NULL
    record_id         int NOT NULL,
    FOREIGN KEY (record_id) REFERENCES abc.parent(record_id)
);
然后我将记录插入到父表和子表中

母公司

|record_id|description|
|1        |abcd       |
|2        |efgh       |
孩子

当我尝试将记录插入细节表时,以下两个实体成功了

Detail
|detail_id|detail_description|record_id|
|100      |detail_desc1      |  1      |
|200      |detail_desc2      |  2      |
但我无法插入记录id为3的条目,因为它给了我一个外键冲突错误

有人能解释这个错误吗

我们可以在Postgresql中创建这样的带继承的外键关系吗

比如说:

继承特性的一个严重限制是索引 (包括唯一约束)和外键约束仅适用 到单个表,而不是它们的继承子表。这是真的 在外键约束的参照侧和参照侧


“全局索引”是表继承缺少的重要特性之一。

很抱歉回答得太晚。正如其他答案所述,约束不是继承的,因此在您的情况下,父表在记录\u id上有一个主键,但子表没有相同的约束。如果没有主键,外键将无法指向它

通过向子表中添加主键约束,可以很容易地解决这个问题。下面的结构可以正常工作:

CREATE TABLE IF NOT EXISTS abc.parent
(
    record_id         SERIAL,
    description       text NOT NULL,
    CONSTRAINT parent_pkey PRIMARY KEY (record_id)
);

--- Child Table

CREATE TABLE IF NOT EXISTS abc.child 
( 
    total_count INT NOT NULL,
    CONSTRAINT child_pkey PRIMARY KEY (record_id)
)  INHERITS (abc.parent);

-- Detail

CREATE TABLE abc.detail
(
  detail_id integer NOT NULL,
  detail_description text NOT NULL,
  record_id integer NOT NULL,
  CONSTRAINT detail_pkey PRIMARY KEY (detail_id),
  CONSTRAINT detail_record_id_fkey FOREIGN KEY (record_id)
      REFERENCES abc.parent (record_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);
这将非常有效,并允许在详细信息表中引用子记录。请注意,我还向detail表中添加了一个primary,这是一种良好的做法(尽管这无助于回答您的问题)

有趣的是,您正在对列创建一个在CREATETABLE语句中没有提到的约束。这是继承列的本质,但一开始可能并不明显


从PostgresSQL的版本10开始,约束继承不受支持,因此必须在子表上重新创建约束(唯一、主键、外键等)。我希望他们尽快解决这个问题

我已经运行了您的代码,然后执行了以下操作:
INSERT INTO abc.child(description,total_count)值('xpto',0);将值(0,,,1)插入abc.detail(详细信息id,详细信息描述,记录id)
但收到了此错误消息:
>SQL错误[23503]:错误:在表上插入或更新“detail”违反了>外键约束“detail\u record\u id\u fkey”Detalhe:key>(record\u id)=(1)在表“parent”中不存在
知道我做错了什么吗?我用的是Postgres 12。
CREATE TABLE IF NOT EXISTS abc.parent
(
    record_id         SERIAL,
    description       text NOT NULL,
    CONSTRAINT parent_pkey PRIMARY KEY (record_id)
);

--- Child Table

CREATE TABLE IF NOT EXISTS abc.child 
( 
    total_count INT NOT NULL,
    CONSTRAINT child_pkey PRIMARY KEY (record_id)
)  INHERITS (abc.parent);

-- Detail

CREATE TABLE abc.detail
(
  detail_id integer NOT NULL,
  detail_description text NOT NULL,
  record_id integer NOT NULL,
  CONSTRAINT detail_pkey PRIMARY KEY (detail_id),
  CONSTRAINT detail_record_id_fkey FOREIGN KEY (record_id)
      REFERENCES abc.parent (record_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);